御阪網路
時間限制: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;
}