1. 程式人生 > >hdu_6055 : Regular polygon (2017 多校第二場 1011) 【計算幾何】

hdu_6055 : Regular polygon (2017 多校第二場 1011) 【計算幾何】

include int scan ble pro set sort 根據 可能

題目鏈接

有個結論: 平面坐標系上,坐標為整數的情況下,n個點組成正n邊形時,只可能組成正方形。

然後根據這個結論來做。

我是先把所有點按照 x為第一關鍵字,y為第二關鍵字 排序,然後枚舉向量 (p[i]->p[j]) (j>i),只判斷這個向量左側可否存在兩個點與它一起構成一個正方形。這樣算的結果是,計數每個正方形時,它的靠右和靠下的兩條邊都會為ans貢獻一個單位,所以最後ans要除以2。

#include<bits/stdc++.h>
using namespace std;

int n;
int vis[605][605];

struct point
{
    
int x,y; bool operator<(const point& rhs)const { return x<rhs.x || x==rhs.x&&y<rhs.y; } }p[505]; int main() { while(~scanf("%d",&n)) { memset(vis,0,sizeof(vis)); int ans=0; for(int i=0;i<n;i++) { scanf("
%d%d",&p[i].x,&p[i].y); p[i].x+=300,p[i].y+=300; vis[p[i].x][p[i].y]=1; } sort(p,p+n); for(int i=0;i<n;i++) for(int j=i+1;j<n;j++) { point a=p[i],b=p[j]; int dx=b.x-a.x; int
dy=b.y-a.y; point c,d; c.x=a.x-dy,c.y=a.y+dx; d.x=b.x-dy,d.y=b.y+dx; if(vis[c.x][c.y]&&vis[d.x][d.y]) ans++; } printf("%d\n",ans/2); } }

hdu_6055 : Regular polygon (2017 多校第二場 1011) 【計算幾何】