HDU 6055 Regular polygon

題目內容
題意:就是給你一些點的橫縱座標,問這些點能組成多少個不同的正多邊形?
如果將每個點都遍歷時間複雜度必然會很高,我們可以只遍歷其中的兩個點,以這兩個點爲已知條件求出能構成正四邊形的另外兩個點(再用二分判斷點是否存在),如若另外兩個點存在的話則這兩個點爲滿足條件的點。

正確代碼:

#include<stdio.h>
#include<string.h>
#include<string>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define eps 1e-7
int n;
struct node
{
    int x;
    int y;
}a[510];
int cmp(node a,node b)
{//按橫座標從小到大的順序排列,如果橫座標相等則按縱座標從小到大排列
    if(a.x==b.x)
        return a.y<b.y;
    return a.x<b.x;
}
bool judge(double x,double y)
{//用二分法判斷點是否存在
    int low=0,high=n-1;
    while(low<=high)
    {
        int mid=(low+high)/2;
        if(fabs(a[mid].x-x)<eps&&fabs(a[mid].y-y)<eps)
            return true;
        else if(a[mid].x-x>eps||(fabs(a[mid].x-x)<eps)&&a[mid].y-y>eps)//判斷條件應注意
            high=mid-1;
        else
            low=mid+1;
    }
    return false;
}
int main()
{
    while(~scanf("%d",&n))
    {
        int i,j,ans=0;
        for(i=0;i<n;i++)
            scanf("%d %d",&a[i].x,&a[i].y);
        sort(a,a+n,cmp);
        for(i=0;i<n;i++)
            for(j=i+1;j<n;j++)
        {
            double ax=(a[i].x+a[j].x)/2.0;//中點的橫座標
            double ay=(a[i].y+a[j].y)/2.0;//中點的縱座標
            double bx=a[i].x-ax;//中點到其中一點的橫座標差
            double by=a[i].y-ay;//中點到其中一點的縱座標差
            if(judge(ax+by,ay-bx)&&judge(ax-by,ay+bx))//找出另外兩點的座標並判斷是否存在,這裏因爲要判斷的是是否滿足正四邊形,因此judge(ax+by,ay-bx),同理judge(ax-by,ay+bx)
                ans++;
        }
        printf("%d\n",ans/2);//如果滿足的話相同的正四邊形會被計算兩遍
    }
    return 0;
}
發佈了131 篇原創文章 · 獲贊 13 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章