BestCoder Round #50 (div.1) 1002 Run (HDU OJ 5365) 暴力枚举+正多边形判定
题目:Click here
题意:给你n个点,有多少个正多边形(3,4,5,6)。
分析:整点是不能构成正五边形和正三边形和正六边形的,所以只需暴力枚举四个点判断是否是正四边形即可。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 #define power(x) ((x)*(x)) 7 using namespace std; 8 const double EPS=1e-8; 9 const int M = 3e+5; 10 struct node { 11 int x,y; 12 }a[100]; 13 int n; 14 int b[100]; 15 int dis(int i,int j) { //计算2点之间的距离 16 return power(a[i].x-a[j].x)+power(a[i].y-a[j].y); 17 } 18 int main() { 19 while( ~scanf("%d", &n ) ) { 20 for( int i=0; i<n; i++ ) { 21 scanf("%d %d", &a[i].x, & a[i].y); 22 } 23 int ans = 0; 24 for( int i=0; i<n; i++ ) { 25 for( int j=i+1; j<n; j++ ) { 26 for( int k=j+1; k<n; k++ ) { 27 for( int l=k+1; l<n; l++ ) { 28 b[0] = dis( i, j ); 29 b[1] = dis( i, k ); 30 b[2] = dis( i, l ); 31 b[3] = dis( j, k ); 32 b[4] = dis( j, l ); 33 b[5] = dis( k, l ); //四边形任意2点的距离 34 sort( b, b+6 ); 35 if( b[0]==b[3] && fabs(b[5]-2*b[0])<EPS && b[4]==b[5] ) { //判定是否为正方形 36 ans++; 37 } 38 } 39 } 40 } 41 } 42 printf("%d\n", ans ); 43 } 44 return 0; 45 }