问答题

【程序5说明】 著名的四色定理指出任何平面区域图均可用四种颜色着色,使相邻区域着不同的颜色。本程序对给定的区域图找出所有可能的不超过四种颜色的着色方案。 程序中用1~4表示四种颜色。要着色的N个区域用0~N-1编号,区域相邻关系用 adj[][]矩阵表示,矩阵的i行j列的元素为1,表示区域i与区域j相邻;矩阵的i行j列的元素为0,表示区域i与区域j不相邻。数组color[]用来存储着色结果,color[i]的值为区域i所着颜色。 【程序5】 #include<stdio.h> #define N 10 void output(int color[])/*输出一种着色方案*/ { int i; for(i=0;i<N;i++) printf("%4d",color[i]); printf("\n"); } int back (int * ip,int color[])/*回溯*/ { int c=4; while(c==4){ if(*ip<=0)return 0; --(*ip); c= (1) ; color[*ip]=-1; } return c; } /*检查区域i,对c种颜色的可用性*/ int colorOk(int i,int c,int [][N],int color[]} { int j; for(j=0;j<i;j++) if( (2) ) return 0; return 1; } /*为区域i选一种可着的颜色*/ int select (int i,int c,int adj[][N],int color[]) { int k; for(k=c;k<=4;k++) if(colorOK( (3) )) return k; return 0; } int coloring(int adj[][N])/*寻找各种着色方案*/ { int color[N],i,c,cnt; for(i=0;i<N;i++)color[i] =-1; i=c=0;cnt=0; while(1){ if((c= (4) )==0){ c=back(&i,color); if(c==0)return cnt; }else{ (5) ;i++; if(i==N){ output(color); ++cnt; c=back(&i,color); }else c=0; } } } void main() { int adj[N][N]= {{0,1,0,1,1,1,1,1,1,1}, {1,0,1,1,0,1,1,1,1,0}, {0,1,0,1,0,1,1,0,1,1}, {1,1,1,0,1,1,0,0,1,1}, {1,0,0,1,0,1,0,0,0,0}, {1,1,1,1,1,0,1,0,0,1}, {1,1,1,0,0,1,0,0,1,0}, {1,1,0,0,0,0,0,0,1,1}, {1,1,1,1,0,0,1,1,0,1}, {1,0,1,1,0,1,0,1,1,0} }; printf("共有%d组解.\n",coloring(adj)); }

【参考答案】

(1)color[*ip] (2)adj[i][j]!=0 && color[j]==c (3)i,k,adj,colo......

(↓↓↓ 点击下方‘点击查看答案’看完整答案 ↓↓↓)
热门 试题

问答题
【程序说明】该程序定义了两个子函数strsort和strmerge。它们分别实现了将一个字符串按字母顺序排序和将两个字符串合并排序,并删去相同字符。在主函数里,先输入两个字符串s1和s2,然后调用strsort函数对它们分别排序,然后调用strmerge函数将s1和s2合并,将合并后的字符串赋给字符串s3,最后输出字符串s3。【程序】#include<stdio.h>void strmerge(char,a,char *b,char *c) 将字符串a,b合并到字符串c中{char t,*w;w=c;while( (1) ){ 找到字符串a,b当前字符中较小的字符if(*a< *b){t= *a;(2) ;{ else if (*a>*b){ t= *b;(3) ;} else 字符串a,b当前字符相等{t= *a;a++;b++;}if( (4) ) 开始,可直接赋值*w=t;else if(t!=*w) 如果a,b中较小的当前字符与c中当前字符不相等,才赋值 (5) ;}if(*a!= ’ 0’) 如果字符串a还没有结束,则将a的剩余部分赋给Cwhile(*a!=’ 0’)if(*a!=*w){*(++w)=*a;a++;}else(6) ;if(*6!=’ 0’) 如果字符串b还没有结束,则将b的剩余部分赋给cwhile(*b!=’ 0’)if(*b! = *w){*(++w)=*b;b++;}elseb++;(7) ;}void strsort(char*s) 将字符串S中的字符排序{int i,j,n;char t,*w;W=S;for(n=0;*w!=’ 0’;n++) 得到字符串长度nw++;for(i=0;i<n-1;i++) 对字符串s进行排序,按字母先后顺序for(j=i+1;j<n;j++)if( (8) ){t=s[i];s[i]=s[j];(9) ;}}void main(){char s1[100],s2[100],s3[100];printf( nPlease,input the first string: );scanf( %s ,s1);printf( nPlease input the second string: );scanf( %s ,s2);strsort(s1); 将字符串s1排序strsort(s2); 将字符串s2排序printf( %s n ,s1); printf( %s n ,s2); s3[0]=’ 0’; 字符串s3的第一个字符先置’ 0’结束标志(10) 将s1和s2合并,按照字母顺序排列, 且要删去相同字符,存入s3中printf( %s ,s3);}