题目链接:​​https://vjudge.net/problem/Gym-101490G​​​
题意:有n个传感器,每个传感器有三个参数(x,y,d),x,y表示传感器的位置,现在让你建一个观测站,这个观测站需要能检测到所有的传感器,如果传感器能被监测站检测到到的话,一定会满足,传感器到检测站的曼哈顿距离等于d,如果只存在一个满足条件的监测站,就直接输出坐标,如果不存在就输出不确定,如果不存在输出impossible
解析:对于每个传感器来说,满足建站位置只能是一个菱形上的整点,那其实是考虑n个菱形是否能交出一点,理论可行,但是很难写。整个二维平面的大小是1e6*1e6,那么我们不妨考虑枚举一个点的传感器所满足的检测站位置,然后去判断是否满足其他监测站,然后这要搞一下,感觉这个在每个传感器规模很大的时候,这个二维平面限制了他,所以及时break,应该不会超时,第一次忘了写break,结果A了,看来数据有点水

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1005;
struct point
{
int x,y,d;
}a[maxn];
int n,ax,ay;
bool judge(int x,int y)
{
for(int i=1;i<n;i++)
{
if(abs(a[i].x-x)+abs(a[i].y-y)!=a[i].d)
return false;
}
ax = x,ay = y;
return true;
}
int main(void)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d %d %d",&a[i].x,&a[i].y,&a[i].d);
int ans = 0;
if(n==1)
{
if(a[0].d)
puts("uncertain");
else
printf("%d %d\n",a[0].x,a[0].y);
}
else
{
for(int i=0;i<=a[0].d;i++)
{
int dy = a[0].d-i;
if(judge(a[0].x+i,a[0].y+dy))
ans++;
if(i&&dy&&judge(a[0].x-i,a[0].y-dy))
ans++;
if(i&&judge(a[0].x-i,a[0].y+dy))
ans++;
if(dy&&judge(a[0].x+i,a[0].y-dy))
ans++;
if(ans>1)
break;
}
if(ans)
{
if(ans==1)
printf("%d %d\n",ax,ay);
else
puts("uncertain");
}
else
puts("impossible");
}
return 0;
}