您的位置:首页 > 其它

pku 2002 squares 几何的推导与hash表的优化

2010-04-01 19:53 337 查看
pku 2002 squares 几何的推导与hash表的优化
题意:给出n个点,判断这些点可以构成多少个不同的正方形.
算法:先确定正方形的2个点(x1,y1),(x2,y2).再利用等边三角形等初中的几何知识,求出另外2个点(x3,y3),(x4,y4).然后利用hash表判断这2个点是否存在.
AC代码:
#include <math.h>
#include <stdio.h>
#define max 2000
#define base 1000

typedef struct
{
int x;
int y;
}Point;
Point point[1005];
bool hash[2*max][2*max]; //用于对付为负数的情况,以2000作为0的标界

int main()
{
freopen("1.txt", "r", stdin);
int i, j, n, ans;
int x1, y1, x2, y2, x3, y3, x4, y4;
while (scanf("%d", &n) && n != 0)
{
for (i = 0; i < n; i++)
{
scanf("%d%d", &point[i].x, &point[i].y);
hash[base+point[i].x][base+point[i].y] = true;
}
ans = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (point[i].x > point[j].x && point[i].y >= point[j].y)
{
//利用正方形在坐标上的关系求出另外的2个点的坐标
x1 = point[i].x; y1 = point[i].y;
x2 = point[j].x; y2 = point[j].y;
x3 = x2 + (y1 - y2); y3 = y2 - (x1 - x2);
x4 = x1 + (y1 - y2); y4 = y1 - (x1 - x2);
//判断这2点是否存在,存在则这四点能构成正方形
if (hash[base+x3][base+y3] && hash[base+x4][base+y4])
{
ans++;
}
}
}
}
printf("%d/n", ans);
//不用memset函数,在这里缩短时间
for (i = 0; i < n; i++)
{
hash[base+point[i].x][base+point[i].y] = false;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: