题目链接 https://www.nowcoder.com/acm/contest/159/A
题目描述
Z市是一座港口城市,来来往往的船只依靠灯塔指引方向。
在海平面上,存在n个灯塔。每个灯塔可以照亮以它的中心点为中心的90°范围。特別地, 由于特殊限制,每个灯塔照亮范围的角的两条边必须要么与坐标轴平行要么与坐标轴成45°。 由于经费限制,Z市的灯塔只能被点亮一座。你需要求出在这种情况下,是否存在一座灯塔能够照亮Z市的所有灯塔。
输入描述
第一行一个整数T,表示数据组数。
对于每组数据,第一行一个整数n,表示灯塔的数量。
接下来n行,每行两个整数xi,yi,表示第i座灯塔的坐标点。
输出描述
如果存在一座灯塔能够照亮Z市的所有灯塔则输出Yes,否则输出No(区分大小写)。
样例输入
2
4
1 1
1 2
2 1
2 2
5
4 7
0 4
7 3
3 0
3 4
样例输出
Yes
No
思路
能否找到一个点在边与坐标轴平行的正方形角上或边与坐标轴倾斜四十五度的正方形角上,在输入的时候记录x,y,x+y,x-y的最大值,最小值,然后遍历所有点判断是否在正方形的角上,是的话就令flag=1,退出循环.
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 0x3f3f3f3f;
const int maxn = 1000005;
int T,n,m;
struct Node {
int x, y;
}node[maxn];
int main() {
cin >> T;
while (T--) {
int xMin, yMin, xMax, yMax, sxMin, syMin, sxMax, syMax, flag = 0, x, y;
xMin = yMin = sxMin = syMin = INF;
xMax = yMax = sxMax = syMax = -INF;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> x >> y;
node[i].x = x;
node[i].y = y;
xMin = min(xMin, x);
yMin = min(yMin, y);
xMax = max(xMax, x);
yMax = max(yMax, y);
sxMin = min(sxMin, x + y);
syMin = min(syMin, x - y);
sxMax = max(sxMax, x + y);
syMax = max(syMax, x - y);
}
for (int i = 0; i < n; i++) {
x = node[i].x;
y = node[i].y;
if (x == xMin && y == yMin || x == xMax && y == yMin || x == xMin && y == yMax || x == xMax && y == yMax || x + y == sxMin && x - y == syMin || x + y == sxMax && x - y == syMin || x + y == sxMin && x - y == syMax || x + y == sxMax && x - y == syMax) {
flag = 1;
break;
}
}
if (flag) {
puts("Yes");
} else {
puts("No");
}
}
return 0;
}