题目描述
给定平面上 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,点不会重合。
思路
利用递推来解决。
完整代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
long long q,p,d,dd,e,ee,c,cc,f,ff,a[5001],b[5001];
bool k[5001][5001];
int main() {
cin>>n;
for(int i=1; i<=n; i++) {
cin>>q>>p;
a[i]=q+50;
b[i]=p+50;
k[a[i]][b[i]]=true;
}
for(int i=1; i<=n; ++i) {
for(int j=1; j<=n; ++j) {
if(i==j) continue;
c=a[i];
cc=b[i];
f=a[j];
ff=b[j];
d=ff-cc+c;
dd=c-f+cc;
e=f+ff-cc;
ee=c-f+ff;
if(e==d&&dd==ee||e<0||d<0||ee<0||dd<0) continue;
if(k[d][dd]==true&&k[e][ee]==true) m++;
}
}
cout<<m/4<<endl;
return 0;
}