Count Squares HDU 3432
来源:互联网 发布:图像处理 分水岭算法 编辑:程序博客网 时间:2024/06/10 15:19
题目链接:
Given a set of points with integer coordinates xi, yi, i = 1...N, your program must find all the squares having each of four vertices in one of these points.
Input
Input file contains integer N followed by N pairs of integers xi yi.Constraints-104 ≤ xi, yi ≤ 104, 1 ≤ N ≤ 2000. All points in the input are different.
Output
Output file must contain a single integer — number of squares found.
Sample Input
Sample input 14 0 0 4 3 -3 4 1 7Sample input 291 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3
Sample Output
Sample output 11Sample output 26
Hint
Bold texts appearing in the sample sections are informative and do not form part of the actual data.
题意:
给你 n 个点,判断存在多少个正方形.
思路:
枚举两个点 || 正方形的边, 然后根据枚举的两个点算出未知的两个点,然后在给出的点中查找这两个点是否出现,如果出现则说明存在正方形,反之说明不存在.
查找的话可以使用hash 或者 map, 但是map 我没有试过,不知道具体能不能行.
代码:
#include<cstdio>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>using namespace std;const int prime = 1999;typedef class{public: int x,y;}node;typedef class Hash{//手动写hash表public: int x, y; Hash *next; Hash(){ next = 0; }}Hash;node a[2000+10];Hash *has[prime];void insert_hash(int pos){//hash的对应法则,我们采用平方和 int k = (a[pos].x * a[pos].x + a[pos].y * a[pos].y) % prime + 1; if(!has[k]){ Hash *tmp = new Hash; tmp->x = a[pos].x; tmp->y = a[pos].y; has[k] = tmp; }else { Hash * tmp = has[k];//如果这个点出现过 while(tmp->next) tmp = tmp->next; tmp->next = new Hash; tmp->next->x = a[pos].x; tmp->next->y = a[pos].y; }}bool Find(int x, int y){ int k = (x * x + y * y) % prime + 1; if(!has[k]) return false; Hash * tmp = has[k]; while(tmp){ if(tmp->x == x && tmp->y == y) return true; tmp = tmp->next; }return false;}int main(){ int n; while(scanf("%d", &n) != EOF && n){ memset(has,0, sizeof(has)); for(int i = 1; i <= n; ++i){ scanf("%d %d", &a[i].x, &a[i].y); insert_hash(i); }int num = 0; for(int i = 1; i <= n; ++i) for(int j = i+1; j <= n; ++j){ int x = a[j].x - a[i].x;//根据已知点算正方形未知点的坐标 int y = a[j].y - a[i].y; int x1 = y + a[i].x; int y1 = a[i].y - x; int x2 = y + a[j].x; int y2 = a[j].y - x; if(Find(x1,y1) && Find(x2,y2)) ++num; x1 = a[i].x - y; y1 = a[i].y + x; x2 = a[j].x - y; y2 = a[j].y + x; if (Find(x1,y1) && Find(x2,y2)) ++num; }printf("%d\n",num/4);//由于每个正方形被算了四次,所以除以4 }return 0;}
阅读全文
0 0
- Count Squares HDU 3432
- PKU 3432 Count Squares
- poj3432---Count Squares
- POJ3432《Count Squares》方法:哈希
- HDU 1264 Counting Squares
- HDU 1264 Counting Squares
- hdu 2977 Color Squares
- hdu 3524 Perfect Squares
- hdu 1256 Counting Squares
- HDU 1264 Counting Squares
- hdu 1264 Counting Squares
- HDU 1264 Counting Squares
- HDU 1264 Counting Squares
- hdu 1264 Counting Squares
- hdu 4758 Walk Through Squares
- 【DFS+剪枝】-HDU-1518-Squares
- [HDU 2977]Color Squares[BFS]
- HDU 2977 Color Squares BFS
- php函数
- time_t数据类型表示的最迟时间是什么
- Linux中对MySQL数据库及表的操作
- 关于《Unity3D/2D游戏开发从0到1》书籍再版说明
- 前端如何进行用户权限管理
- Count Squares HDU 3432
- SpringMVC-拦截器
- SIP协议的学习
- linux jdk安装
- 循环试题三
- 异步加载AsyncTask imooc课程信息
- 今日头条|张一鸣:我遇到的优秀年轻人的5个特质
- CentOS安装JDK
- Nginx环境下http和https(ssl)共存的方法