标签:turn 编译 四色 else image -- lazy 解答 函数
做过一个面试题,要求是写一个程序,求四色问题的所有解,即给定一个地图,已知共有N个区域,求用四种颜色给地图着色,要求相邻的两个区域不能着同一个色,要说明一下,有共同边的两个区域才算相邻,两个区域仅相交于一个点或有限个点不属于相邻,这就是著名的四色问题。题目其实是给出了一个程序,让我填五个空,但我在答题过程中没有解答出来,不服气,回家用了两个半天才做出来,不得不承认自己的基本功不扎实啊。
在家里根据回忆能记起大概用了哪几个函数,基本结构也是能记得很多的,回来的工作就是复原之前看到过的这个题目,并且要解答出正确的结果。当然一些细节记得不是很清楚,所以可能结构还没有题目中的合理,留给自己以后慢慢优化吧。但总算是做出来了,因此写下来,留给以后参考。
所用的地图如下图所示:
用来着色的地图
执行代码如下:
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 #define N 10 5 6 /* 打印出配色结果 */ 7 int printcol(int *col) 8 { 9 int i; 10 for(i=0;i<N;i++) 11 { 12 printf("%d ", col[i]); 13 } 14 printf("\n"); 15 return 0; 16 } 17 18 /* 回朔 */ 19 int backcol(int i, int *col) 20 { 21 int tmp, cur; 22 cur = i; 23 tmp=col[cur]; 24 while(tmp>=4) 25 { 26 col[cur] = -1; 27 cur--; 28 if(cur<0) 29 { 30 return -1; 31 } 32 tmp = col[cur]; 33 } 34 col[cur] = tmp+1; 35 return cur; 36 } 37 38 /* 判断某颜色是否可用 */ 39 int colorOK(int i, int c, int *col, int adj[][N]) 40 { 41 int j; 42 for(j=0;j<N;j++) 43 { 44 if(j!=i && adj[i][j] && col[j]==c) 45 { 46 return -1; 47 } 48 } 49 return 0; 50 } 51 52 /* 选择一种配色方案 */ 53 int selcol(int i, int c, int *col, int adj[][N]) 54 { 55 if(!colorOK(i, c, col, adj)) 56 { 57 return c; 58 } 59 return 0; 60 } 61 62 /* 计算出所有可能的结果 */ 63 int colorPlan(int adj[][N]) 64 { 65 int i, c, cnt; 66 int color[N]={0}; 67 for(i=0;i<N;i++) 68 { 69 color[i] = -1; 70 } 71 72 c=1;i=0;cnt=0; 73 while(1) 74 { 75 if((c=selcol(i, c, color, adj)) == 0) 76 { 77 i=backcol(i, color); 78 c=color[i]; 79 if(i<0) 80 { 81 printf("1\n"); 82 return cnt; 83 } 84 } 85 else 86 { 87 color[i]=c; 88 i++; 89 c=1; 90 if(i==N) 91 { 92 printcol(color); 93 cnt++; 94 i=backcol(i-1, color); 95 c=color[i]; 96 if(i<0) 97 { 98 printf("2\n"); 99 return cnt; 100 } 101 } 102 } 103 } 104 return 0; 105 } 106 107 int main() 108 { 109 int adj[][N]={ 110 {1,1,0,1,1,0,0,0,0,0}, {1,1,1,0,1,0,0,0,0,0}, 111 {0,1,1,0,1,1,0,0,0,1}, {1,0,0,1,1,0,1,1,0,0}, 112 {1,1,1,1,1,1,1,0,0,0}, {0,0,1,0,1,1,1,0,1,0}, 113 {0,0,0,1,1,1,1,1,1,0}, {0,0,0,1,0,0,1,1,1,0}, 114 {0,0,0,0,0,1,1,1,1,1}, {0,0,1,0,0,0,0,0,1,1} 115 }; 116 printf("共有%d种配色方案\n", colorPlan(adj)); 117 return 0; 118 }
编译:
gcc mapcol.c -o mcolor
方法不一定是最优的,不过可以自己慢慢优化。
[转自网易博客,原作时间:2013-08-19 16:54:23]
标签:turn 编译 四色 else image -- lazy 解答 函数
原文地址:https://www.cnblogs.com/lrcsangel/p/14822173.html