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;
}
题意:给出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;
}
相关文章推荐
- POJ 2002 Squares 几何 + 二分搜索 或 hash
- pku 2002 -- Squares(二分,几何)
- POJ 2002 Squares(计算几何 找正方形 hash枚举)
- [hash] PKU 2002 Squares
- pku 2002 Squares 二分查找 或者 hash
- POJ 2002 几何+hash
- pku2002 Squares (折半查找)
- pku 2002Squares 二分查找
- Hash (poj2002-Squares & poj3349-Snowflake Snow Snowflakes)
- Hash poj2002 Squares
- poj 2002 Squares(枚举+点hash)
- Poj 2002 Squares (正方形个数 Hash)
- poj 2002 Squares 几何二分 || 哈希
- POJ 2002 - Squares(hash)
- POJ 2002 Squares 计算集合 点的hash
- POJ 2002 Squares (Hash)
- ACM: 几何题+hash题 poj 2002
- poj 2002 :Squares(hash 不解释)
- poj 2002_Squares_ 4000 hash
- poj 2002 Squares【HASH】POJ最快