牛客网-Wannafly挑战赛21-A.灯塔

题目链接 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值