"四染色"問題:用不多於四種顏色對地圖着色,使相鄰的區域不重色。
算法思想:從第一個區域開始染色,每一個區域依次用顏色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"); }
結果:
同理可計算任意種顏色和任意區域數的顏色填充問題