假设星空是一个二维平面,每颗星星由其x和y坐标指定,找到所有可能由夜空中的一组恒星形成的正方形。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define de(x) cout<<x<<" ";
#define sf(x) scanf("%lld",&x);
#define Pu puts("");
const int N=1e6+10;
ll a[1005],b[1005];
int hed[N],nxt[N],x[N],y[N],tot;
int n,m,ans;
void init_hash(ll i,ll j){//hash,使得快速查询每个点
ll d=i*i+j*j;
d%=999991;
x[++tot]=i;y[tot]=j;
nxt[tot]=hed[d];
hed[d]=tot;
}
int check(ll i,ll j){
ll d=i*i+j*j;
d%=999991;
for(int k=hed[d];k;k=nxt[k]){
if(x[k]==i&&y[k]==j) return 1;
}
return 0;
}
int main(){
while(cin>>n){
if(n==0) break;
tot=0;memset(hed,0,sizeof(hed));ans=0;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i];
init_hash(a[i],b[i]);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j) continue;
ll a,b,c,d;
a=x[i]-(y[j]-y[i]);
b=y[i]+x[j]-x[i];
c=x[j]-(y[j]-y[i]);
d=y[j]+x[j]-x[i];
if(check(a,b)&&check(c,d)) ans++;
}
}
printf("%d\n",ans/4);
}
return 0;
}