码迷,mamicode.com
首页 > 其他好文 > 详细

用C程序实现求四色问题所有解

时间:2021-06-02 14:27:22      阅读:0      评论:0      收藏:0      [点我收藏+]

标签: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]

用C程序实现求四色问题所有解

标签:turn   编译   四色   else   image   --   lazy   解答   函数   

原文地址:https://www.cnblogs.com/lrcsangel/p/14822173.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!