POJ 2002, Squares

Time Limit: 3500MS  Memory Limit: 65536K
Total Submissions: 6320  Accepted: 2024


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

 

Source
Rocky Mountain 2004


//  POJ2002.cpp : Defines the entry point for the console application.
//

#include 
< iostream >
#include 
< algorithm >
using   namespace  std;

struct  Point
{
    
int  x;
    
int  y;
};

struct  Node
{
    Node():next(
0 ){}
    
int  x;
    
int  y;
    Node
*  next;
};

bool  findPoint(Node hash[],  int  x,  int  y,  int  SIZE)
{
    
int  key  =  (x  *  x  +  y  *  y)  %  SIZE;
    Node
*  pt  =   & hash[key];
    
while  (pt -> next  !=  NULL)
    {
        pt 
=  pt -> next;
        
if  (pt -> ==  x  &&  pt -> ==  y) return   true ;
    }
    
return   false ;
};

int  main( int  argc,  char *  argv[])
{
    
const   int  SIZE  =   33119 ;
    Point pts[
1000 ];
    Node hash[SIZE];

    
int  n;
    
while (cin  >>  n  &&  n  !=   0 )
    {
        memset(hash,
0 , sizeof (hash));
        
for  ( int  i  =   0 ; i  <  n;  ++ i)
        {
            Node
*  pn  =   new  Node;
            scanf(
" %d %d " & pts[i].x,  & pts[i].y);
            pn
-> =  pts[i].x;
            pn
-> =  pts[i].y;
            
int  key  =  (pn -> *  pn -> +  pn -> *  pn -> y)  %  SIZE;
            Node
*  pt  =   & hash[key];
            
while  (pt -> next  !=  NULL)pt  =  pt -> next;
            pt
-> next  =  pn;
        }

        
int  cnt  =   0 ;
        
for ( int  i  =   0 ; i  <  n;  ++ i)
            
for  ( int  j  =  i  +   1 ; j  <  n;  ++ j)
            {
                
int  x  =  pts[i].x  -  pts[j].x;
                
int  y  =  pts[i].y  -  pts[j].y;

                
int  x1  =  pts[i].x  +  y;
                
int  y1  =  pts[i].y  -  x;
                
int  x2  =  pts[j].x  +  y;
                
int  y2  =  pts[j].y  -  x;

                
if  (findPoint(hash,x1,y1,SIZE)  &&  findPoint(hash,x2,y2,SIZE))  ++ cnt;

                x1 
=  pts[i].x  -  y;
                y1 
=  pts[i].y  +  x;
                x2 
=  pts[j].x  -  y;
                y2 
=  pts[j].y  +  x;

                
if  (findPoint(hash,x1,y1,SIZE)  &&  findPoint(hash,x2,y2,SIZE))  ++ cnt;
            };

        cout 
<<  (cnt  >>   2 <<  endl;
    }
    
return   0 ;
}

转载于:https://www.cnblogs.com/asuran/archive/2009/10/09/1579539.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值