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