您的位置:首页 > 其它

poj 2002 -- Squares

2014-07-25 10:28 246 查看
Squares

Time Limit: 3500MSMemory Limit: 65536K
Total Submissions: 15886Accepted: 6013
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

思路:
    正方形已知两点(x1,y1),(x2,y2)求另两点坐标:
      x3=x1+y1-y2;
      y3=y1-x1+x2;
      x4=x2+y1-y2;
      y4=y2-x1+x2;

      x3=x1-y1+y2;
      y3=y1+x1-x2;
      x4=x2-y1+y2;
      y4=y2+x1-x2;
计算出坐标后可以用hash查找。用静态邻接表模拟拉链。。


/*======================================================================
*           Author :   kevin
*         Filename :   Squares.cpp
*       Creat time :   2014-07-25 09:41
*      Description :
========================================================================*/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#define clr(a,b) memset(a,b,sizeof(a))
#define M 20000
using namespace std;
struct Node
{
int x,y;
}node[1005];
int head[2*M+5];
struct EdgeNode{
int to,next;
};
EdgeNode Edges[2*M+5];

void AddEdges(int i,int j,int cnt)
{
Edges[cnt].to = j;
Edges[cnt].next = head[i];
head[i] = cnt;
}
bool judge(int x,int y)
{
for(int k = head[x]; k != -1; k = Edges[k].next){
if(Edges[k].to == y)
return true;
}
return false;
}
int main(int argc,char *argv[])
{
int n;
while(scanf("%d",&n)!=EOF && n){
clr(node,0);
clr(head,-1);
clr(Edges,0);
int k = 0;
for(int i = 0; i < n; i++){
scanf("%d%d",&node[i].x,&node[i].y);
AddEdges(M+node[i].x,M+node[i].y,k++);
}
int x1,x2,x3,x4,y1,y2,y3,y4;
int cnt = 0;
for(int i = 0; i < n; i++){
for(int j = i+1; j < n; j++){
x1 = node[i].x + node[i].y - node[j].y;
y1 = node[i].y - node[i].x + node[j].x;
x2 = node[j].x + node[i].y - node[j].y;
y2 = node[j].y - node[i].x + node[j].x;
if(judge(x1+M,y1+M)){
if(judge(x2+M,y2+M)){
cnt++;
}
}
x3 = node[i].x - node[i].y + node[j].y;
y3 = node[i].y + node[i].x - node[j].x;
x4 = node[j].x - node[i].y + node[j].y;
y4 = node[j].y + node[i].x - node[j].x;
if(judge(x3+M,y3+M)){
if(judge(x4+M,y4+M)){
cnt++;
}
}
}
}
printf("%d\n",cnt/4);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: