POJ 2002 Squares

来源:互联网 发布:php程序员自我评价 编辑:程序博客网 时间:2024/06/06 02:42

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

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

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

#include <iostream>#include <cstdio>#include <memory.h>#include <algorithm>using namespace std;#define maxn 1050struct 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;}
0 0