POJ-2002 Squares

Squares
题目链接
Time Limit: 3500MS Memory Limit: 65536K
Total Submissions: 21115 Accepted: 8103
Descriptionv

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

题目大意
给你N个点求能组成的正方形数。

题解
首先想到一个 N^4 的方案,枚举 4 个点,再check。
实际上,对于一个正方形,我们只需要定住两个点就可以,所以定住另外两个点的位置。
这里写图片描述
对于里面的小正方形,我们假设知道左下角和右下角。那么我们就能根据横纵坐标差求出 a 和 b ,然后利用 a 和 b 求出另外两点。

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1005,maxa=20005;
int n,h[maxa<<1][maxn],num[maxa<<1];
struct js{
    int x,y;
}a[maxn];
int read()
{
    int ret=0,f=1;char ch=getchar();
    while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
    while (ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();
    return ret*f;
}
bool cmp(js a,js b){return a.x<b.x||(a.x==b.x&&a.y<b.y);}
bool fin(int x,int y)
{
    if (!num[x]) return 0;
    int L=1,R=num[x];
    while (L<=R)
    {
        int mid=(R-L>>1)+L;
        if (h[x][mid]==y) return 1;
        else if (h[x][mid]>y) R=mid-1;else L=mid+1;
    }
    return 0;
}
bool check(int x,int y)
{
    int A=a[y].x-a[x].x,B=a[y].y-a[x].y;
    return(fin(a[x].x-B,a[x].y+A)&&fin(a[y].x-B,a[y].y+A));
}
int main()
{
    while (n=read())
    {
        int x,lst=0,ans=0;
        memset(num,0,sizeof num);
        for (int i=1;i<=n;i++)
        {
            a[i].x=x=read()+2e4;
            a[i].y=h[x][++num[x]]=read();
        }
        for (int i=0;i<=4e4;i++)
        {
            if (num[i]<=1) continue;
            if (num[i]==2) {if (h[i][1]>h[i][2]) swap(h[i][1],h[i][2]);}else
            sort(h[i]+1,h[i]+(1+num[i]));
        }
        sort(a+1,a+n+1,cmp);check(1,4);
        for (int j=2;j<=n;j++)
         for (int i=1;i<j;i++)
           if (check(i,j)) ans++;
        printf("%d\n",ans>>1);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xu0_zy/article/details/79743941