Squares-暴力枚举或者二分
B - Squares
Time Limit:3500MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
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.
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
/* Author: 2486 Memory: 24256 KB Time: 375 MS Language: C++ Result: Accepted */ //此题目暴力暴力枚举 //通过已经确定好的两点,算出剩下的两点 //(有两种情况) //一个在上面,一个以下 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=20000+5; struct point{ int x,y; }ps[1005]; int n,ans; bool vis[maxn<<1][maxn<<1]; int main(){ while(~scanf("%d",&n),n){ ans=0; for(int i=0;i<n;i++){ scanf("%d%d",&ps[i].x,&ps[i].y); ps[i].x+=20000,ps[i].y+=20000;//在数组里面能够存储负数 vis[ps[i].x][ps[i].y]=true;//标记着这个点存在 } for(int i=0;i<n;i++){ for(int j=0;j<i;j++){ if(i==j)continue;//分别代表着上下两种不同的正方形 int nx1=ps[i].x+ps[i].y-ps[j].y; int ny1=ps[i].y+ps[j].x-ps[i].x; int nx2=ps[j].x+ps[i].y-ps[j].y; int ny2=ps[j].y+ps[j].x-ps[i].x; if(vis[nx1][ny1]&&vis[nx2][ny2])ans++; nx1=ps[i].x-(ps[i].y-ps[j].y); ny1=ps[i].y-(ps[j].x-ps[i].x); nx2=ps[j].x-(ps[i].y-ps[j].y); ny2=ps[j].y-(ps[j].x-ps[i].x); if(vis[nx1][ny1]&&vis[nx2][ny2])ans++; } } for(int i=0;i<n;i++){ vis[ps[i].x][ps[i].y]=false;//必需要进行清零,不能用memset,由于数组有点大 } printf("%d\n",ans/4); } return 0; }