原题传送:
再错分析:
对这题印象挺深刻的,觉得应该再刷没问题,结果还是败了,想到用排序,但在整理距离的数据时就全乱套了,尤其是这一部分
for ( i=1; i<=n; i++ )
{
cnt = 1;
memset ( dis, 0, sizeof(dis) );
for ( j=1; j<=n; j++ )
{
dis[cnt] = distance(a[i].x,a[j].x,a[i].y,a[j].y);
cnt++;
}
首先是犯了老毛病,忘记归零重置了,即
cnt = 1;
memset ( dis, 0, sizeof(dis) );
忘记了
然后就是for循环的条件了,绕了好久没绕出来,以为是冒泡的条件,即把所有两两配对的点找出来就好了,其实再好好理解下题意就直到怎么改了。
第一个i是找基准点,然后第二个j是遍历全部的点计算i与j的全部可能距离,故可能的情况要远远大于两两配对的点的情况。
还有一个十分糟心的地方就是sort函数,因为不是从0下标开始计数,又是第一次用c++的sort函数,要精确计算出排序的长度,不然结果就会有误(因为多余的数据被memset为0了)
AC代码:
#include <bits/stdc++.h>
using namespace std;
struct point{
int x,y;
};
int distance ( int x1, int x2, int y1, int y2 ){
return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}
int main(){
int t,n;
int i,j,k;
cin >> t;
point a[1001];
int dis[1001];
while ( t-- )
{
cin >> n;
for ( i=1; i<=n; i++ )
cin >> a[i].x >> a[i].y;
int sum=0;
int cnt=1;
for ( i=1; i<=n; i++ )
{
cnt = 1;
memset ( dis, 0, sizeof(dis) );
for ( j=1; j<=n; j++ )
{
dis[cnt] = distance(a[i].x,a[j].x,a[i].y,a[j].y);
cnt++;
}
sort(dis+1, dis+n+1);
for ( k=1; k<=n; k++ )
if ( dis[k] == dis[k+1] )
sum += 2;
}
if ( sum==0 ) cout << "WA" << endl;
else
cout << sum << endl;
}
return 0;
}