给一些散点,找出可以构成平行四边形的数量(需排除四点共线情况,所给点可能有重复)代码内容如下:
#include<iostream>
#include<cstring>
using namespace std;
#define NL 1601
#define MD 119997
int hash1[MD];
struct POINT {
int x, y;
}p[NL];
struct MIDDLE{
POINT P,A,B;
}mid[MD];
void hashing(int k) {
int key=(((mid[k].P.x)*1000+(mid[k].P.y)*1234)%MD+MD)%MD;
while (hash1[key] >=0) key = (key + 1) % MD;
hash1[key] = k;
}
int searching(MIDDLE po) {
int key=(((po.P.x)*1000+(po.P.y)*1234)%MD+MD)%MD;
int sign=0;
while (hash1[key] >=0) {
int T = hash1[key];
if (mid[T].P.x == po.P.x && mid[T].P.y == po.P.y){
if((mid[T].A.x!=po.A.x||mid[T].A.y!=po.A.y)&&(mid[T].A.x!=po.A.x||mid[T].A.y!=po.A.y)){
if((mid[T].A.y-mid[T].B.y)*(mid[T].A.x-po.A.x)!=(mid[T].A.x-mid[T].B.x)*(mid[T].A.y-po.A.y)){
sign++;}}}
key = (key + 1) % MD;
}
return sign;
}
int M[400]={0};
int main(){
int n,m,a,b;
cin>>n;
if(n>100){
return 0;}
for(int i=0;i<n;i++){
memset(hash1,-1,MD);
cin>>m;
if(m>400){
return 0;}
int sum=0;
for(int j=0;j<m;j++){
cin>>a;
cin>>b;
p[j].x=a;
p[j].y=b;}
int num=1;
for(int r=0;r<m;r++){
for(int s=r+1;s<m;s++){
mid[num].P.x=p[r].x + p[s].x;
mid[num].P.y=p[r].y + p[s].y;
mid[num].A.y = p[r].y; mid[num].A.x = p[r].x;
mid[num].B.y = p[s].y; mid[num].B.x = p[s].x;
hashing(num);
sum+=searching(mid[num]);
num++;}}
M[i]=sum;}
for(int i=0;i<n;i++){
cout<<M[i]<<endl;}
return 0;}