算法栈在回溯法中的应用-地图四染色问题

Posted ♚帅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法栈在回溯法中的应用-地图四染色问题相关的知识,希望对你有一定的参考价值。

"四染色"问题:用不多于四种颜色对地图着色,使相邻的区域不重色。

算法思想:从第一个区域开始染色,每一个区域依次用颜色1,2,3,4进行试探,如果当前所试探的颜色与周围区域都不同色,则用栈记录该区域色数,否则用下一色数继续试探;如果四种颜色都与相邻区域重色,那么需要退栈,修改栈顶色数,即更改上一区域的颜色继续试探。

数据结构:

  • s[]栈的顺序存储,用于表示区域的染色
  • dist[][]地图邻接矩阵,0表示不邻接,1表示邻接,区域与它自己表示为不邻接

以六区域为例:

/**
* 地图四染色问题
* @author SunShuai
*
*/
#include<stdio.h>
void mapcolor(int dist[6][6], int areanum,int s[6]){
    s[0] = 1;//一号地区涂一号色
    int curarea = 1;//当前应该涂的区域
    int color = 1;//颜色
    int i = 0;
    while (curarea < areanum){//还没涂完
        while (color <= 4 && curarea < areanum){//每种颜色进行试探
            i = 0;
            while ((i < curarea) && (s[i] * dist[curarea][i] != color)){//与当前区域相邻的已染色区域是否有与此种颜色相同的
                i++;
            }
            if (i<curarea){//k<curarea,提前退出循环,说明此种颜色不可用,比对下一种颜色
                color++;
            }
            else{//此种颜色可用
                s[curarea] = color;//当前区域染色
                curarea++;//开始下一区域
                color = 1;//color从一开始
            }
        }
        if (color>4){//color>4说明找不到合适的颜色对当前区域进行染色,回溯,更改上一个区域的颜色,
            curarea--;
            color = s[curarea] + 1;//因为上一个区域已经染色,所以从已染色的下一个颜色开始即可
        }
    }
    
}
void main() {
    int areaNum = 6;//地区数量
    int dist[6][6] = {//邻接矩阵,0表示不邻接
        { 0, 1, 1, 0, 0, 1 },
        { 1, 0, 1, 1, 1, 1 },
        { 1, 1, 0, 1, 0, 0 },
        { 0, 1, 1, 0, 1, 0 },
        { 0, 1, 0, 1, 0, 1 },
        { 1, 1, 0, 0, 1, 0 }
    };
    int s[6];//记录颜色
    mapcolor(dist, areaNum,s);
    for (int o = 0; o < areaNum; o++){
        printf("%d号区域:第%d号颜色\\n", o + 1, s[o]);
    }
    system("pause");
}

结果:

同理可计算任意种颜色和任意区域数的颜色填充问题

 

以上是关于算法栈在回溯法中的应用-地图四染色问题的主要内容,如果未能解决你的问题,请参考以下文章

回溯算法

0-1背包问题的回溯法中,剪枝用的上界函数问题

栈在括号匹配中的应用

回溯法编程技巧

算法设计与分析 实验三 回溯法求解地图填色问题

栈在前端中的应用,顺便再了解下深拷贝和浅拷贝!