Squares
2015-08-04 11:46
295 查看
Squares
Time Limit: 3500MS Memory Limit: 65536K
Total Submissions: 17462 Accepted: 6634
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
Source
Rocky Mountain 2004
在推正方形顶点时,多亏了金巨巨,金巨巨就是给力
Time Limit: 3500MS Memory Limit: 65536K
Total Submissions: 17462 Accepted: 6634
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
Source
Rocky Mountain 2004
在推正方形顶点时,多亏了金巨巨,金巨巨就是给力
#include <map> #include <list> #include <cmath> #include <queue> #include <stack> #include <string> #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; #define eps 1e-9 #define LL long long #define PI acos(-1.0) #define INF 0x3f3f3f3f #define CRR fclose(stdin) #define CWW fclose(stdout) #define RR freopen("input.txt","r",stdin) #define WW freopen("output.txt","w",stdout) const int MAX = 1010; struct node { int x; int y ; }Point[MAX]; bool cmp(node b,node c) { if(b.x<c.x||(b.x==c.x&&b.y<c.y)) { return true; } return false; } bool Look(int low,int high,int x,int y)//二分查找 { int i=low,j=high; while(i<=j) { int mid=(i+j)/2; if(Point[mid].x==x&&Point[mid].y==y) { return true; } if(Point[mid].x<x) { i=mid+1; } else if(Point[mid].x>x) { j=mid-1; } else if(Point[mid].x==x) { if(Point[mid].y<y) { i=mid+1; } else if(Point[mid].y>y) { j=mid-1; } } } return false; } int main() { int n; while(scanf("%d",&n),n) { for(int i=0;i<n;i++) { scanf("%d %d",&Point[i].x,&Point[i].y); } sort(Point,Point+n,cmp); int sum=0; for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { int ans=(Point[i].x+Point[j].x-Point[j].y+Point[i].y);//计算正方形的其余的两个顶点 int ant=(Point[i].y+Point[j].y+Point[j].x-Point[i].x); bool flag=false; if(ans%2==0&&ant%2==0) { flag=Look(0,n-1,ans/2,ant/2); } if(!flag) { continue; } flag=false; ans=(Point[i].x+Point[j].x+Point[j].y-Point[i].y); ant=(Point[i].y+Point[j].y-Point[j].x+Point[i].x); if(ans%2==0&&ant%2==0) { flag=Look(0,n-1,ans/2,ant/2); } if(flag) { sum++; } } } printf("%d\n",sum/2);//对于每个正方形都会查找到两次,所以除二 } return 0; }
相关文章推荐
- HDU 5078--Osu!【水题】
- C++内联函数
- Squares 分类: POJ 2015-08-04 11:46 3人阅读 评论(0) 收藏
- 2.0-iptables详解
- centos6.6_x64升级firefox
- Squid Epoll网络模型
- Qt 常用类(3)—— QString
- 滤镜属性
- JSON与JAVA数据的相互转换
- AngularJs 初学
- Nginx goaccess 安装应用指南
- 使用Spring的jdbcTemplate进一步简化JDBC操作
- 学习笔记:只有一套app设计稿(5s尺寸)切出4和4s尺寸以及安卓系统主流尺寸的图
- 2015年8月4日11:43:00工作内容
- 比特币钱包应用breadwallet源码iOS版
- 博弈知识汇总
- Lua快速排序算法+代码
- mmap 函数
- nyoj 88 汉诺塔(一)【快速幂】
- nginx支持ssl简介