POJ 2002 点的hash

2014-11-24 12:43:43 · 作者: · 浏览: 0
Squares
Time Limit: 3500MS Memory Limit: 65536K
Total Submissions: 15489 Accepted: 5864

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

4
1 0
0 1
1 1
0 0
9
0 0
1 0
2 0
0 2
1 2
2 2
0 1
1 1
2 1
4
-2 5
3 7
0 0
5 2
0

Sample Output

1
6
1


二维平面给定一堆点,求可以组成正方形的个数,点数为1000,因此不能枚举四个点判断,

比较优化的方法是将所有点hash,然后枚举两个点,计算出另外两个点的坐标,然后在hash表里查找,最后结果除以4,因为每一条边被统计了4次。

代码:

/* ***********************************************
Author :_rabbit
Created Time :2014/5/11 8:26:00
File Name :20.cpp
************************************************ */
#pragma comment(linker, "/STACK:102400000,102400000")
#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include 
         
           #include 
          
            #include 
           
             #include 
            
              #include 
             
               #include 
              
                #include 
                using namespace std; #define INF 0x3f3f3f3f #define eps 1e-8 #define pi acos(-1.0) typedef long long ll; const int maxn=100009; class HASH{ public: struct Node{ int next,to; Node(int _next=0,int _to=0){ next=_next;to=_to; } }edge[10010]; int tol,head[maxn+10]; void clear(){ memset(head,-1,sizeof(head));tol=0; } void add(int x,int y){ if(find(x,y))return; int t=(x+maxn)%maxn; edge[tol]=Node(head[t],y); head[t]=tol++; } int find(int x,int y){ int t=(x+maxn)%maxn; for(int i=head[t];i!=-1;i=edge[i].next) if(edge[i].to==y) return 1; return 0; } }mi; int x[1010],y[1010]; int main() { //freopen("data.in","r",stdin); //freopen("data.out","w",stdout); int n; while(~scanf("%d",&n)&&n){ mi.clear(); for(int i=0;i