POJ 2002 Squares

来源:互联网 发布:mounty11 for mac下载 编辑:程序博客网 时间:2024/04/28 17:03

Squares
Time Limit: 3500MS Memory Limit: 65536KTotal Submissions: 14440 Accepted: 5441

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

Sample Output

161


分析:hash。

Code:

#include <algorithm>#include <iostream>#include <cstring>#include <string>#include <cstdio>#include <vector>#include <queue>#include <cmath>#include <map>#include <set>#define eps 1e-7#define LL long long#define pb push_back#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define Max(a,b) ((a)>(b)?(a):(b))#define Min(a,b) ((a)<(b)?(a):(b))using namespace std;const int MOD=40000;struct node{    int x,y;}p[1005];int Hash[MOD+MOD],next[1005];int n;bool cmp(node a,node b){    if(a.x==b.x) return a.y>b.y;    return a.x<b.x;}bool find(int x,int y){    int tmp=x+y;    if(tmp<0) tmp+=MOD;    for(int i=Hash[tmp];i!=-1;i=next[i]){        if(p[i].x==x&&p[i].y==y) return true;    }    return false;}int main(){    while(scanf("%d",&n),n){        for(int i=0;i<n;i++) scanf("%d %d",&p[i].x,&p[i].y);        sort(p,p+n,cmp);        memset(Hash,-1,sizeof(Hash));        for(int i=0;i<n;i++){            int tmp=p[i].x+p[i].y;            if(tmp<0) tmp+=MOD;            next[i]=Hash[tmp];            Hash[tmp]=i;        }        int ans=0;        for(int i=0;i<n;i++){            for(int j=i+1;j<n;j++){                int a=p[i].x+p[i].y-p[j].y;                int b=p[i].y+p[j].x-p[i].x;                if(!find(a,b)) continue;                a=p[j].x+p[i].y-p[j].y;                b=p[j].y+p[j].x-p[i].x;                if(!find(a,b)) continue;                ans++;            }        }        printf("%d\n",ans/2);    }    return 0;}


原创粉丝点击