题解:CF1184C1 Heidi and the Turing Test (Easy)
CodeForces 上 AC 了但是洛谷上一直 UKE,我也不知道为什么,但我还是来写题解了。
思路
题目要求我们找出唯一不在正方形边上的点,很容易想到枚举每一个点,如果剔除这个点后剩下所有点都在正方形边上,那么这个点就是额外的那个点。
怎么检查所有点是否在同一个正方形的边上呢?我们可以记录所有点(除了被剔除的那一个)的最大 \(x\) 坐标 \(\max x\),最小 \(x\) 坐标 \(\min x\),最大 \(y\) 坐标 \(\max y\),最小 \(y\) 坐标 \(\min y\),正方形的上下边即为 \(\max x\) 和 \(\min x\),左右边为 \(\min y\) 和 \(\max y\)。
如果 \(\max x-\min x ≠ \max y-\min y\),那么这个图形就不是一个正方形,直接输出 false。
给所有的点(除被剔除的点)在坐标系上打上标记,计算在正方形边上的点的数量(即 \(x=\max x\) 或 \(x=\min x\) 或 \(y=\max y\) 或 \(y=\min y\) 的点的数量),如果其数量不等于 \(4n\),则代表不是所有点都在正方形边上,判断不通过。
如果以上检测都通过,那么这个被剔除的点就是多余的点,直接输出。
AC 代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=55,INF=0x3f3f3f3f;
int n,cnt[N];
pair<int,int> a[N];
bool flag[N][N];
bool check(int no)
{
memset(flag,false,sizeof(flag));
int \min x=INF,\max x=0,\min y=INF,\max y=0;
for(int i=1;i<=n;i++)
{
if(i==no) continue;
flag[a[i].first][a[i].second]=true;
\min x=min(\min x,a[i].first),\max x=max(\max x,a[i].first);
\min y=min(\min y,a[i].second),\max y=max(\max y,a[i].second);
}
if(\max x-\min x!=\max y-\min y) return false;
int cnt=0;
for(int i=\min x;i<=\max x;i++)
{
if(flag[i][\min y]) cnt++;
if(flag[i][\max y]) cnt++;
}
for(int i=\min y+1;i<=\max y-1;i++)
{
if(flag[\min x][i]) cnt++;
if(flag[\max x][i]) cnt++;
}
return cnt==n-1;
}
int main()
{
scanf("%d",&n); n=n*4+1;
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].first,&a[i].second);
for(int i=1;i<=n;i++)
if(check(i)) printf("%d %d\n",a[i].first,a[i].second);
return 0;
}
//CF don't ban me!
2024-08-08 20:43 撰写于洛谷,2025-08-29 20:48 迁移至博客园。
本文采用 「CC-BY-NC 4.0」 创作共享协议,转载请注明作者及出处,禁止商业使用。
作者:Jerrycyx,原文链接:https://www.cnblogs.com/jerrycyx/p/19065158

浙公网安备 33010602011771号