1. 程式人生 > >御阪網路

御阪網路

時間限制: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;
}