时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
作为「Misaka Network」的中心司令塔的 LastOrder出事了,为了维持 「Misaka Network」的正常工作,需要临时选出一个Sister作为中心司令塔。
为了弥补能力上的不足,对于选出的Sister有一些要求。
具体来说,平面上有 n 个 Sister,问能否找到一个Sister作为中心司令塔,使得其他 Sister 都在以她为圆心的一个圆上,如果找不到这样的Sister,则输出 "-1"(不含引号)。
输入描述:
第一行一个数 n 接下来 n 行,第 i 行两个整数 xi, yi ,表示第 i 个Sister在平面上的坐标。
输出描述:
输出共一个数,表示选出的Sister的编号,如果找不到则输出 "-1"。
示例1
输入
3 1 1 0 1 1 2
输出
1
备注:
3 ≤ n ≤ 1000,-109≤ xi, yi ≤ 109 ,所有坐标互不相同。
题意很明了,但是愚笨的我还是没通过,一开始的思路是去计算每个点到其余各点的距离,然后逐个比较。后来就一直错,开了一个二维数组来储存距离,然后用循环遍历。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int d[1010][1010];
struct node
{
int x,y;
} s[1010];
int main()
{
int n,i,j;
scanf("%d",&n);
for(i=1; i<=n; i++)
{
scanf("%d%d",&s[i].x,&s[i].y);
}
for(i=1; i<=n; i++)
{
for(j=1; j<i; j++)
{
d[i][j]=d[j][i]=(s[j].x-s[i].x)*(s[j].x-s[i].x)+(s[j].y-s[i].y)*(s[j].y-s[i].y);
}
}
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
if(i!=j&&d[i][j]!=d[i][i%n+1])//这里也可以写成d[i][i+1];
break;
}
if(j>n)
{
printf("%d\n",i);
return 0;
}
}
printf("-1\n");
return 0;
}