POJ 2002.Squares
2017-11-09 11:45
267 查看
题目:http://poj.org/problem?id=2002
AC代码(C++):
总结: 又是一道经典的哈希题. 总结下这一类的方法: 遇到像这样看似可以简单的枚举但一定会超时的题目, 就用哈希. 具体做法是, 将输入的对象拆分, 比如poj1840题(http://blog.csdn.net/njyexiong/article/details/78481702), 就是把等式拆分成两部分, 一边插入一边搜索. 这题也一样, 将正方形的四个点拆分成两个一对, 枚举输入的所有点对, 通过已知的两点求正方形中其他两个点的位置, 然后在哈希表中看这两个点是否存在, 存在则正方形存在.
关于已知正方形中相邻的两点(x1,y1), (x2,y2), 求其余两点的表达式:
x3 = y2 - y1 + x2
y3 = x1 - x2 + y2
x4 = y2 - y1 + x1
y4 = x1 - x2 + y1
因为一个正方形有4个边, 故一个正方形会重复计算4次, 所以最终答案应该/4.
AC代码(C++):
#include <iostream> #include <algorithm> #include <stdio.h> #include <vector> #include <queue> #include <math.h> #include <string> #include <string.h> #include <bitset> #define INF 0xfffffff #define MAXN 100005 using namespace std; const int N = 1005; const int H = 997; struct Node { int x,y; int next; }; Node node[N]; int cur; int hashTable[H]; int n; void initHash() { cur = 0; for (int i = 0; i < H; ++i) hashTable[i] = -1; } void insertHash(int x, int y) { int h = abs(x+y)%H; node[cur].x = x; node[cur].y = y; node[cur].next = hashTable[h]; hashTable[h] = cur; cur++; } bool searchHash(int x, int y) { int h = abs(x+y)%H; int next = hashTable[h]; while (next != -1) { if (node[next].x == x&&node[next].y == y) return true; next = node[next].next; } return false; } int main(){ while(cin>>n){ if(n==0)break; int ans = 0; initHash(); for(int i = 0; i < n; i++){ int tmpx, tmpy; cin>>tmpx>>tmpy; insertHash(tmpx,tmpy); } for(int i = 0; i < cur; i++){ for(int j = 0; j < cur; j++){ if(i==j)continue; int x3,y3,x4,y4; x3 = node[j].y - node[i].y + node[j].x; y3 = node[i].x - node[j].x + node[j].y; x4 = node[j].y - node[i].y + node[i].x; y4 = node[i].x - node[j].x + node[i].y; if(searchHash(x3,y3)&&searchHash(x4,y4))ans++; } } cout<<ans/4<<endl; } }
总结: 又是一道经典的哈希题. 总结下这一类的方法: 遇到像这样看似可以简单的枚举但一定会超时的题目, 就用哈希. 具体做法是, 将输入的对象拆分, 比如poj1840题(http://blog.csdn.net/njyexiong/article/details/78481702), 就是把等式拆分成两部分, 一边插入一边搜索. 这题也一样, 将正方形的四个点拆分成两个一对, 枚举输入的所有点对, 通过已知的两点求正方形中其他两个点的位置, 然后在哈希表中看这两个点是否存在, 存在则正方形存在.
关于已知正方形中相邻的两点(x1,y1), (x2,y2), 求其余两点的表达式:
x3 = y2 - y1 + x2
y3 = x1 - x2 + y2
x4 = y2 - y1 + x1
y4 = x1 - x2 + y1
因为一个正方形有4个边, 故一个正方形会重复计算4次, 所以最终答案应该/4.
相关文章推荐
- poj 2002 Squares
- poj 2002 Squares
- POJ-2002 Squares,哈希模板+数学公式!
- POJ-2002-Squares
- POJ 2002 Squares【值得摸索的一道二分+点旋转】
- poj 2002 Squares
- [POJ2002 Squares]
- poj2002——Squares
- ZOJ2347 Squares (POJ2002 二分查找)
- POJ 2002 Squares
- POJ 2002 Squares [hash]
- POJ 2002 Squares (哈希)
- POJ 2002 Squares (Hash)
- POJ 2002 Squares
- poj 2002 Squares 判断一些点能组成多少个正方形 二分查找
- POJ 2002 Squares 计算集合 点的hash
- [POJ2002]Squares【平面几何】
- poj 2002 Squares,hash
- poj 2002 Squares(hash)
- poj 2002 Squares