HDU - 5533 G - Dancing Stars on Me (水題&&幾何)
阿新 • • 發佈:2018-11-14
連結:
http://acm.hdu.edu.cn/showproblem.php?pid=5533
題意:
給出n個點,座標全是整數,問能否構成一個正多邊形。
思路:
看了題解才發現自己想多了。座標是整數的正多邊形其實只有正方形。
以前的思路是,對於所有點,找距離它最遠的點,只要最遠的距離全部一樣,就是正多邊形,這個應該是個廣泛的特點。
自己的做法:
#include <bits/stdc++.h> using namespace std; int a[107]; int t,n; struct Node { int x,y; } node[107]; int dis(Node a,Node b) { return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y); } int main() { for(cin>>t; t--;) { cin>>n; int maxlen = 0; int flag = 1; int isfirst = 1; for(int i = 0; i < n; i++) { cin>>node[i].x>>node[i].y; } for(int i = 0; i < n ; i++) { int maxn = 0; for(int j = 0; j < n; j++) { maxn = max(maxn, dis(node[i],node[j])); } if(isfirst) { isfirst = 0; maxlen =maxn; } else if(maxlen != maxn) { flag = 0; break; } } if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
找正方形的做法:(四個邊相等,兩條對角線相等)
#include <bits/stdc++.h> using namespace std; int x[107],y[107],dis[6]; int t,n; struct Node { int x,y; } node[4]; int diss(Node a,Node b) { return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y); } bool judge() { dis[0] = diss(node[0],node[1]); dis[1] = diss(node[1],node[2]); dis[2] = diss(node[2],node[3]); dis[3] = diss(node[3],node[0]); dis[4] = diss(node[0],node[2]); dis[5] = diss(node[1],node[3]); sort(dis,dis+6); if(dis[0] == dis[1] && dis[1] == dis[2] && dis[2] == dis[3] && dis[4] == dis[5]) return true; return false; } int main() { for(cin>>t; t--;) { cin>>n; int maxlen = 0; int flag = 1; int isfirst = 1; for(int i = 0; i < n; i++) { cin>>x[i]>>y[i]; } if(n != 4) { cout<<"NO"<<endl; continue; } for(int i = 0 ; i < 4; i++) { node[i].x = x[i]; node[i].y = y[i]; } if(judge()) { cout<<"YES"<<endl; } else { cout<<"NO"<<endl; } } return 0; }