View Code of Problem 1056

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1005
using namespace std;
struct node
{
	int x,y;
}s[N],mid[N*N];
bool cmp(node a,node b)
{
	if(a.x!=b.x)
	   return a.x<b.x;
	return a.y<b.y;
}
int main()
{
	int t,cnt=1;
	scanf("%d",&t);
	while(t--)
	{
		int n,flag=0;
		scanf("%d",&n);
		for(int i=0;i<n;i++)
		  scanf("%d%d",&s[i].x,&s[i].y);
		for(int i=0;i<n;i++)
		  for(int j=i+1;j<n;j++)  //j从i+1开始判断,避免重复计算 
		  {
		  	 mid[flag].x=s[i].x+s[j].x;//记录中点坐标,不除以2也一样,避免有小数点 
		  	 mid[flag++].y=s[i].y+s[j].y;
		  }
		sort(mid,mid+flag,cmp);
		int ans=1,sum=0;
		for(int i=1;i<flag;i++)
		{
			if(mid[i].x==mid[i-1].x&&mid[i].y==mid[i-1].y)
			   ans++;
			else
			{
				sum+=ans*(ans-1)/2;//排列组合 
				ans=1;
			}
		}
		printf("Case %d: %d\n",cnt++,sum);
	}
	return 0;
}

Double click to view unformatted code.


Back to problem 1056