【计算几何】FZU Problem 2270 Two Triangles
生活随笔
收集整理的這篇文章主要介紹了
【计算几何】FZU Problem 2270 Two Triangles
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
http://acm.fzu.edu.cn/problem.php?pid=2270
【題意】
給定6到10個(gè)點(diǎn),從中選出6個(gè)不同的點(diǎn)組成兩個(gè)三角形,使其中一個(gè)三角形可以通過(guò)另一個(gè)三角形平移和旋轉(zhuǎn)得到。問(wèn)有多少種不同的三角形選法?
【思路】
- 全等
- 排除對(duì)稱(chēng)
【Accepted】
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 using namespace std; 9 10 int n; 11 const double eps=1e-6; 12 struct Point 13 { 14 int x; 15 int y; 16 Point(){} 17 Point(int _x,int _y):x(_x),y(_y){} 18 Point operator-(const Point &b)const 19 { 20 return Point(x-b.x,y-b.y); 21 } 22 int operator^(const Point &b)const 23 { 24 return x*b.y-y*b.x; 25 } 26 int operator*(const Point &b)const 27 { 28 return x*b.x+y*b.y; 29 } 30 }p[12]; 31 bool v[11][11][11][11][11][11]; 32 int dist(int i,int j) 33 { 34 return (p[i]-p[j])*(p[i]-p[j]); 35 } 36 int dis[12][12]; 37 bool judge(int i,int j,int k) 38 { 39 double x=sqrt(dist(i,j)); 40 double y=sqrt(dist(i,k)); 41 double z=sqrt(dist(j,k)); 42 double a[3]={x,y,z}; 43 sort(a,a+3); 44 if(fabs(a[0]+a[1]-a[2])<=eps) 45 { 46 return false; 47 } 48 return true; 49 } 50 51 bool check(int i,int j,int k,int l,int m,int o,int flag) 52 { 53 int a[3]={i,k,m}; 54 int b[3]={j,l,o}; 55 sort(a,a+3); 56 sort(b,b+3); 57 if(v[a[0]][a[1]][a[2]][b[0]][b[1]][b[2]]) 58 { 59 return true; 60 } 61 if(flag) 62 { 63 v[a[0]][a[1]][a[2]][b[0]][b[1]][b[2]]=1; 64 } 65 return false; 66 } 67 68 bool rt(int i,int j,int k,int l,int m,int o) 69 { 70 if(((p[k]-p[i])^(p[m]-p[k]))*((p[l]-p[j])^(p[o]-p[l]))<0)//叉積的乘積大于等于0代表方向是一樣的,如果方向不一樣,說(shuō)明是對(duì)稱(chēng)的 71 { 72 return false; 73 } 74 if(((p[m]-p[k])^(p[i]-p[m]))*((p[o]-p[l])^(p[j]-p[o]))<0) 75 { 76 return false; 77 } 78 if(((p[i]-p[m])^(p[k]-p[i]))*((p[j]-p[o])^(p[l]-p[j]))<0) 79 { 80 return false; 81 } 82 return true; 83 } 84 int main() 85 { 86 int T; 87 scanf("%d",&T); 88 int cas=0; 89 while(T--) 90 { 91 //這個(gè)數(shù)組用來(lái)去重,一定要初始化 92 memset(v,0,sizeof(v)); 93 int ans=0; 94 scanf("%d",&n); 95 for(int i=1;i<=n;i++) 96 { 97 scanf("%d%d",&p[i].x,&p[i].y); 98 } 99 for(int i=1;i<=n;i++) 100 { 101 for(int j=1;j<=n;j++) 102 { 103 if(j==i) continue; 104 for(int k=1;k<=n;k++) 105 { 106 if(k==i||k==j) continue; 107 for(int l=1;l<=n;l++) 108 { 109 if(l==i||l==j||l==k) continue; 110 if(dist(i,k)!=dist(j,l)) continue; 111 //目前為止已經(jīng)選出兩個(gè)三角形對(duì)應(yīng)相等的兩條邊ik和jl 112 for(int m=1;m<=n;m++) 113 { 114 if(m==i||m==j||m==k||m==l) continue; 115 //先選出m點(diǎn),排除三點(diǎn)共線(xiàn)的情況 116 if(!judge(i,k,m)) continue; 117 for(int o=1;o<=n;o++) 118 { 119 if(o==i||o==j||o==k||o==l||o==m) continue; 120 if(dist(k,m)!=dist(l,o)||dist(m,i)!=dist(o,j)) continue; 121 //現(xiàn)在已經(jīng)選出兩個(gè)全等的三角形 122 if(check(i,j,k,l,m,o,0)) continue; 123 //去重,如果是重復(fù)的重新選擇 124 if(rt(i,j,k,l,m,o))//因?yàn)橹荒苁瞧揭坪托D(zhuǎn)得到,所以要排除對(duì)稱(chēng)這種情況 125 { 126 ans++; 127 check(i,j,k,l,m,o,1);//把這種選擇標(biāo)記為1 128 } 129 } 130 } 131 } 132 } 133 } 134 } 135 printf("Case %d: %d\n",++cas,ans); 136 } 137 return 0; 138 } View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/itcsl/p/7210407.html
總結(jié)
以上是生活随笔為你收集整理的【计算几何】FZU Problem 2270 Two Triangles的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: QTP 无法识别web 大全
- 下一篇: 生成MD5加密