hdu 5563 Clarke and five-pointed star (枚举)
题意:给出5个点的坐标,问这5个点是否刚好是一个五角星的顶点。
思路:
dfs枚举5个点的顺序。
判断5条邻边相等,5条对角线相等。若均满足则是,否则不是。
附:为什么要判断5条对角线也相等才行呢?
如图,一个正方形上面一个正三角形,同样满足 5条邻边相等,但不满足5条对角线相等。
代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<cstdlib> 6 #include<cmath> 7 #include<vector> 8 #include<queue> 9 #include<map> 10 #include<set> 11 #define eps 10e-6 12 13 using namespace std; 14 15 double x[8],y[8]; 16 bool vis[8]; 17 int order[6]; 18 double dis[12]; 19 20 double cal(int i,int j) 21 { 22 return (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]); 23 } 24 25 bool isok() 26 { 27 for(int i=0;i<4;i++) 28 dis[i] = cal(order[i+1],order[i+2]); 29 dis[4] = cal(order[5],order[1]); 30 int flag1 = 1; 31 for(int i=0;i<4;i++) 32 { 33 if(fabs(dis[i]-dis[4])>eps) 34 { 35 flag1 = 0; 36 break; 37 } 38 } 39 40 dis[5] = cal(order[1],order[3]); 41 dis[6] = cal(order[1],order[4]); 42 dis[7] = cal(order[2],order[4]); 43 dis[8] = cal(order[2],order[5]); 44 dis[9] = cal(order[3],order[5]); 45 int flag2 = 1; 46 for(int i=5;i<9;i++) 47 { 48 if(fabs(dis[i]-dis[9])>eps) 49 { 50 flag2 = 0; 51 break; 52 } 53 } 54 return flag1 && flag2; 55 } 56 57 bool dfs(int pos) 58 { 59 if(pos == 6) 60 { 61 if(isok()) 62 return true; 63 } 64 for(int i=0;i<5;i++) 65 { 66 if(!vis[i]) 67 { 68 order[pos] = i; 69 vis[i] = true; 70 if(dfs(pos+1)) return true; 71 vis[i] = false; 72 } 73 } 74 return false; 75 } 76 77 int main() 78 { 79 int T; 80 scanf("%d",&T); 81 while(T--) 82 { 83 memset(vis,0,sizeof(vis)); 84 for(int i=0;i<5;i++) 85 scanf("%lf%lf",&x[i],&y[i]); 86 if(dfs(1)) puts("Yes"); 87 else puts("No"); 88 } 89 return 0; 90 }