【算法】棧在回溯法中的應用-地圖四染色問題


"四染色"問題:用不多於四種顏色對地圖着色,使相鄰的區域不重色。

算法思想:從第一個區域開始染色,每一個區域依次用顏色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");
}

結果:

同理可計算任意種顏色和任意區域數的顏色填充問題

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM