Time Limit: 3500MS | Memory Limit: 65536K | |
Total Submissions: 9869 | Accepted: 3518 |
Description
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
Output
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 x1+y26 1
额,题目意思很简单,就是给你一堆点的集合,让你找出所有可由这些点构成的正方形个数。
开始就想到把所有得点都搜一遍,可以用两个点来确定正方形的一条边,然后可以用这两点的坐标得到另外的两点坐标信息。再在所有的点中搜索符合条件的点是否存在。
如果正方形的一条边确定了,而且这条边的两个端点为A(x1,y1),B(x2,y2),那么可以有简单的几何计算得
另外两点为C(x1+y2-y1,y1+x1-x2),D(x2+y2-y1,y2+x1-x2);CD为AB右上方的边。
在这里我们只需要查找AB边右上方的符合条件的点,因为搜索AB左下方的点也就相当于左下方的点搜索右上方。
这里用到了Stl中的二分查找函数binary_search(v,v+n,p,op)可以轻松解决找点的过程(开始自己写了几个查找的函数可是都TLE了 .....T_T)
代码:
#include<iostream>
#include<algorithm>
#include<climits>
using namespace std;
int n;
struct point{
int x;
int y;
}v[1002];
bool cmp(const struct point &a,const struct point &b)
{
if(a.x==b.x)
return a.y<b.y;
else
return a.x<b.x;
}
int main()
{
while(scanf("%d",&n)&&n)
{
for(int i=0;i<n;i++)
{
scanf("%d%d",&v[i].x,&v[i].y);
}
if(n<4)
{printf("0\n");}
else{
int ans=0;
sort(v,v+n,cmp);
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
point c,d;
c.x = v[i].x + v[j].y - v[i].y;
c.y = v[i].y + v[i].x - v[j].x;
d.x = v[j].x + v[j].y - v[i].y;
d.y = v[j].y + v[i].x - v[j].x;
if(!binary_search(v,v+n,c,cmp))
continue;
if(!binary_search(v,v+n,d,cmp))
continue;
ans++;
}
}
printf("%d\n",ans/2);
}
}
return 0;
}