御坂网络

时间限制: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;
}
 

猜你喜欢

转载自blog.csdn.net/aini875/article/details/83035192
今日推荐