网站:CSUST7月23号
A题:大意是:一个N多边形,用红,绿,蓝三色给定点上色,要求划分成顶点颜色不同的三角形。
解析:
这道题是黑书上分治法的例题,还是比较巧的。
首先很容易发现当某种颜色的点只有一个时,很容易解决,只需将该点与其余的点连起来即可。
当每种颜色的点都超过一个时,可以证明必定有三个不同颜色的点连在一起,将这三个点连成一个三角形即可。
于是就可以不断减少点的个数,转化为某种颜色只有一个点的情况。

1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 using namespace std; 5 int r,g,b,c[10010],l; 6 int f(char a[]) 7 { 8 int i,j; 9 r=b=g=0; 10 for(i=0;i<l;i++) //每次都要统计颜色的个数 11 { 12 if(a[i]=='R') 13 r++; 14 else if(a[i]=='G') 15 g++; 16 else if(a[i]=='B') 17 b++; 18 } 19 if(r==1) 20 { 21 for(i=0;i<l;i++) 22 if(a[i]=='R') 23 { 24 for(j=i-2;j>=(i==l-1?1:0);j--) 25 printf("%d %d ",c[i]+1,c[j]+1); 26 for(j=i+2;j<(i==0?l-1:l);j++) 27 printf("%d %d ",c[i]+1,c[j]+1); 28 } 29 return 0; 30 } 31 else if(g==1) 32 { 33 for(i=0;i<l;i++) 34 if(a[i]=='G') 35 { 36 for(j=i-2;j>=(i==l-1?1:0);j--) 37 printf("%d %d ",c[i]+1,c[j]+1); 38 for(j=i+2;j<(i==0?l-1:l);j++) 39 printf("%d %d ",c[i]+1,c[j]+1,l); 40 } 41 return 0; 42 } 43 else if(b==1) 44 { 45 for(i=0;i<l;i++) 46 if(a[i]=='B') 47 { 48 49 for(j=i-2;j>=(i==l-1?1:0);j--) 50 printf("%d %d ",c[i]+1,c[j]+1); 51 for(j=i+2;j<(i==0?l-1:l);j++) 52 printf("%d %d ",c[i]+1,c[j]+1); 53 } 54 return 0; 55 } 56 else 57 { 58 for(i=0;i<l-3;i++) 59 if(a[i]!=a[i+1]&&a[i+1]!=a[i+2]&&a[i]!=a[i+2]) 60 { 61 printf("%d %d ",c[i]+1,c[i+2]+1); 62 for(j=i+1;j<l-1;j++) //删去中间那个点 63 { 64 a[j]=a[j+1]; 65 c[j]=c[j+1]; 66 } 67 c[l-1]='