您的位置:首页 > 其它

POJ 2002 Squares

2015-12-21 23:35 381 查看
之前没怎么做过这种几何的题目,这次通过这道题也是知道了一些简单的做几何题目的思考方向,本题就是在一大堆点中找正方形,值得注意的是正方形有可能是斜着的= =

大体思路是对点进行枚举,先按照横纵坐标从小到大的顺序排序,然后对点进行两两配对,以配对的两个点为基准,找另外两个点在不在我们的点集里面。

现在的问题就在于如何确定另外两个点在哪里,画一个草图以后我们可以看到已知两个点,确定一个正方形有两种可能,但是因为我们预先排了序,所以我们只需要考虑一种方向就可以了,利用简单的全等三角形就可以求出来两个点的坐标

#include <iostream>
#include <cstdio>
#include <memory.h>
#include <algorithm>
using namespace std;

#define maxn 1050

struct data{
int x,y;
};

data p[maxn]={0};

bool cmp(const data &a,const data &b){
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}

int main(){
int n;
while(scanf("%d",&n),n){
memset(p,0,sizeof(p));
for(int i=0;i<n;++i){
scanf("%d%d",&p[i].x,&p[i].y);
}
sort(p,p+n,cmp);
int ans = 0;

for(int i=0;i<n;++i){
for(int j=i+1;j<n;++j){
data tmp;

tmp.x = p[i].x + p[i].y - p[j].y;
tmp.y = p[i].y - p[i].x + p[j].x;

if(!binary_search(p, p + n, tmp, cmp))
continue;

tmp.x = p[j].x + p[i].y - p[j].y;
tmp.y = p[j].y - p[i].x + p[j].x;

if(!binary_search(p, p + n, tmp, cmp))
continue;

ans ++;
}
}
printf("%d\n",ans/2);
}
//system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: