Squares - POJ 2002 哈希

来源:互联网 发布:淘宝网络公司 编辑:程序博客网 时间:2024/05/22 02:17

Squares
Time Limit: 3500MS Memory Limit: 65536KTotal Submissions: 15556 Accepted: 5891

Description

A square is a 4-sided polygon whose sides have equal length and adjacent sides form 90-degree angles. It is also a polygon such that rotating about its centre by 90 degrees gives the same polygon. It is not the only polygon with the latter property, however, as a regular octagon also has this property. 

So we all know what a square looks like, but can we find all possible squares that can be formed from a set of stars in a night sky? To make the problem easier, we will assume that the night sky is a 2-dimensional plane, and each star is specified by its x and y coordinates. 

Input

The input consists of a number of test cases. Each test case starts with the integer n (1 <= n <= 1000) indicating the number of points to follow. Each of the next n lines specify the x and y coordinates (two integers) of each point. You may assume that the points are distinct and the magnitudes of the coordinates are less than 20000. The input is terminated when n = 0.

Output

For each test case, print on a line the number of squares one can form from the given stars.

Sample Input

41 00 11 10 090 01 02 00 21 22 20 11 12 14-2 53 70 05 20



题意:这些点能够组成多少个正方形。

思路:枚举两个点,利用哈希判断另外两个点是否存在。

AC代码如下:

#include<cstdio>#include<cstring>#include<vector>using namespace std;struct node{ int x,y;};vector<node> hash[23333];int X[1010],Y[1010],times=0;int Hash(int x,int y){ int v=(x*237+y*237*237);  if(v<0)   v=0-v+23333;  v%=23330;  return v;}bool find(int x,int y){ int v=Hash(x,y);  for(int i=0;i<hash[v].size();i++)  { if(x==hash[v][i].x && y==hash[v][i].y)     return true;  }  return false;}int main(){ int n,i,j,k,v,x1,x2,y1,y2,x,y;  long long ans;  while(~scanf("%d",&n) && n>0)  { times++;    ans=0;    memset(hash,0,sizeof(hash));    for(i=1;i<=n;i++)    { scanf("%d%d",&X[i],&Y[i]);      v=Hash(X[i],Y[i]);      node nod1;      nod1.x=X[i];      nod1.y=Y[i];      hash[v].push_back(nod1);    }    for(i=1;i<n;i++)    { for(j=i+1;j<=n;j++)      { x=X[i]-X[j];        y=Y[i]-Y[j];        x1=X[i]+y;        y1=Y[i]-x;        x2=X[j]+y;        y2=Y[j]-x;        //printf("%d %d %d %d\n",x1,y1,x2,y2);        if(find(x1,y1)&& find(x2,y2))         ans++;        x1=X[i]-y;        y1=Y[i]+x;        x2=X[j]-y;        y2=Y[j]+x;        y2=Y[j]+x;        //printf("%d %d %d %d\n",x1,y1,x2,y2);        if(find(x1,y1)&& find(x2,y2))         ans++;        // printf("%I64d\n\n",ans);      }    }    printf("%I64d\n",ans/4);  }}


0 0
原创粉丝点击