时间限制1.00s 内存限制125.00MB 难易度:普及/提高−
【题目描述】
给定平面上 N 个点,你需要计算以其中 4 个点为顶点的正方形的个数。注意这里的正方形边不一定需要和坐标轴平行。
【输入格式】
第一行一个数 N。
接下来 N 行每行两个数,表示点的坐标。
【输出格式】
一个数表示正方形的个数。
【输入输出样例】
输入 #1
7 0 0 0 1 1 0 1 1 1 2 2 1 2 2
输出 #1
3
【说明/提示】
对于 20% 的数据,满足 1≤N≤20。
对于 100% 的数据,满足 1≤N≤500,−50≤Xi,Yi≤50,点不会重合。
【算法分析】
这道题要枚举对角线,然后算出另外两点判断存不存在。
int midx = (x[i] + x[j]) / 2; int midy = (y[i] + y[j]) / 2; int x1 = midx - (midy - y[i]), y1 = midy + (midx - x[i]); int x2 = midx + (midy - y[i]), y2 = midy - (midx - x[i]);
【参考代码】
#include <bits/stdc++.h>
using namespace std;
long long n,m,x[1000],y[1000];
bool k[2000][2000];
int t,ans=0;
int main()
{
cin>>t;
for(int i=1;i<=t;i++)
{
cin>>x[i]>>y[i];
x[i]=(x[i]+51)<<1;y[i]=(y[i]+51)<<1;
k[x[i]][y[i]]=1;
}
for(int i=1;i<t;i++)
{
for(int j=i+1;j<=t;j++)
{
int midx=(x[i]+x[j])/2;
int midy=(y[i]+y[j])/2;
int x1=midx-(midy-y[i]),y1=midy+(midx-x[i]);
int x2=midx+(midy-y[i]),y2=midy-(midx-x[i]);
if(x1<=0)continue;
if(y1<=0)continue;
if(x2<=0)continue;
if(y2<=0)continue;
if(k[x1][y1]&&k[x2][y2])ans++;
}
}
cout<<ans/2;
return 0;
}