首页 > 代码库 > 【算法】栈在回溯法中的应用-地图四染色问题
【算法】栈在回溯法中的应用-地图四染色问题
"四染色"问题:用不多于四种颜色对地图着色,使相邻的区域不重色。
算法思想:从第一个区域开始染色,每一个区域依次用颜色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");}
结果:
同理可计算任意种颜色和任意区域数的颜色填充问题
【算法】栈在回溯法中的应用-地图四染色问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。