洛谷T778652 模拟赛1 T3 露营(camp)
T778652 模拟赛1 T3 露营(camp)
题目描述
小明和他的两位好朋友要在野外露营,经过认真的规划后,他们将整片地区划分为了若干个由 \(1 \times 1\) 的小方格共同组成的平面直角坐标系。
经过一番商议后,他们决定在 \(A,B,C\) 三点出安营扎寨(\(A,B,C\) 各占据了一个 \(1 \times 1\) 的小方格,且相互之间位置不同)。由于野外有许多枯枝败叶,他们希望能够清理一些小方格,以便他们相互拜访。
具体来说,开始时,所有的小方格都被未被清理(包括 \(A,B,C\) 三个点)。他们可以通过相邻的清理之后的小方格,从其他方格到达 \(A、B、C\) 中的任何一个。如果两个小方格有共同边,则它们相邻。
因此,请你帮忙计算一下,他们最少需要清理的小方格数量有多少?
输入格式
输入三行,每行各两个整数,分别表示三人安营扎寨的位置。
输出格式
输出共一行,表示最少需要清理的小方格数量。
输入输出样例 #1
输入 #1
0 0
1 1
2 2
输出 #1
5
输入输出样例 #2
输入 #2
0 0
2 0
1 1
输出 #2
4
输入输出样例 #3
输入 #3
350 201
562 186
499 128
输出 #3
286
说明/提示
样例 1 解释
一种最优方案为清理 \((0,0),(0,1),(1,1),(1,2),(2,2)\)。
数据规模与约定
- 对于 \(30\%\) 的数据,保证 \(0 \le x,y \le 2\)。
- 对于 \(100\%\) 的数据,保证 \(0 \le x,y \le 1000\)。
这题难点在于一个知识点:
曼哈顿距离:
假设两点\(A(x_1,y_1),B(x_2,y_2)\)
则两点间的曼哈顿距离\(dis(A,B)=|x_1 - x_2|+|y_1 - y_2|\)
就是两点间的最少格子数(有兴趣的读者可以画图看一看,真的很好画)
知道这个知识点这题就明朗了,思路和代码奉上
ACcode:
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int x[4],y[4];
int dis(int x1,int y1,int x2,int y2){
return abs(x1-x2)+abs(y1-y2);
}
/*
定义distance函数为某点P走到到某点Q的方块数
发现无论怎么走,两点连线作为对角线且边与坐标轴平行或垂直的矩形中路程都相等且最短
因此最短距离min_distance=|x1-x2|+|y1-y2|
寻找三点间的最短距离只需要找到这三个点两两围成的三个矩形的公共点即可
而这个中心点(暂且称为P)的坐标为:
xp=(x1,x2,x2)的中位数
yp=(y1,y2,y3)的中位数
证明:
例如A(x1,y1)在偏左边,B(x2,y2)居中,C(x3,y3)偏右边
则矩形AB和矩形BC必有一条公共边过B点(画图直观)
所以P的横坐标就是x的中位数
同理可得纵坐标结论
综上ans=dis(A,P)+dis(B,P)+dis(C,P)+1->这个1是P自己的那一格
*/
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
for(int i=1;i<=3;i++){
cin>>x[i]>>y[i];
}
sort(x+1,x+4);
sort(y+1,y+4);
int xp=x[2],yp=y[2];
int ans=0;
for(int i=1;i<=3;i++){
ans+=dis(x[i],y[i],xp,yp);
}
ans++;
cout<<ans;
return 0;
}
//Author:AAA_jiancaipifa

浙公网安备 33010602011771号