1. 程式人生 > >圖的四色著色(C語言)

圖的四色著色(C語言)

2017計算機學碩複試真題

用四種顏色給地圖著色,要求相鄰塊顏色不同,圖用鄰接矩陣儲存,求所有著色方案。

思路:

(草稿)

遞迴,如用下圖,做出鄰接矩陣:

map[N][N] = {   0,1,1,0,1,
1,0,1,0,1,
1,1,0,1,0,
0,0,1,0,1,

1,1,0,1,0  }

inputColor(int n,int *color,int col,int sign)是一個遞迴函式,其中

n表示給第n個點著色 ,col=1表示已經著色,col=0表示未著色 ,sign=0表示未驗證,sign=1表示已驗證且可行

有以下三種情況:col    sign

   0       0//未著色 ,則著色
   1       0//已著色但未驗證 

   1       1//著色且此色可用

故在函式中分三種情況判斷:

1、if(col == 0)  //未著色

那麼將每一種顏色(顏色用1,2,3,4表示)賦給color[n],並呼叫遞迴inputColor(n,color,1,0) 去驗證著此色是否可行 

2、if(col==1 && sign==0) //已著色但未驗證 

那麼驗證此位用此色是否行得通,驗證方法:在鄰接矩陣中找到與此點相鄰的點,若這些點的顏色不相鄰,則

inputColor(n,color,1,1)//此色可用,sign置為1,若此色不可行,則不作處理,也就不會再有任何操作,也無法列印

3、if(col==1 && sign==1) //著色且此色可用

那麼,判斷一下此時的n是否是最後一位,若是最後一位即n==N-1,則表示所有位都成功賦予一個顏色,故列印輸出

若n<N-1,則去進行處理下一位,inputColor(n+1,color,0,0),當然,下一位的col和sign都是0,回到第一種情況繼續處理這一位。

=========================================================================

故如此遞迴,可以找出所有的著色方案。

程式碼如下:

#include<stdio.h>
#define N 5
int map[N][N] = {0,1,1,0,1,
    1,0,1,0,1,
    1,1,0,1,0,
    0,0,1,0,1,
    1,1,0,1,0};//五個點,七條邊的圖,鄰接矩陣表示
int main(){
    void inputColor(int n,int *color,int col,int sign);
    int color[5]={0};
    inputColor(0,color,0,0);
    return 0;
}
/**給第n個點著色 ,col=1表示已經著色,col=0表示未著色 ,sign=0表示未驗證,sign=1表示已驗證且可行 **/
/*
 有以下三種情況:col    sign
 0       0//未著色 ,則著色
 1       0//已著色但未驗證
 1       1//著色且此色可用
 當n=N-1,即最後一位時,若此時col==1,sign==1,則可列印輸出
 */
void inputColor(int n,int *color,int col,int sign){
    int i;
    if(col == 0){//未著色 ,則著色
        for(i=1;i<=4;i++){//顏色1-4
            color[n] = i;
            inputColor(n,color,1,0);//驗證著此色是否可行
            
        }
    }
    else if(col==1 && sign==0){//已著色但未驗證 ,則驗證此位
        for(i=0;i<N;i++)
            if(map[n][i]==1 && color[n]==color[i])
                return;ç
        inputColor(n,color,1,1);//此色可用,sign置為1
    }
    else if(col==1 && sign==1){//著色且此色可用
        if(n<N-1)//進行下一位
            inputColor(n+1,color,0,0);
        else if(n==N-1){//若此位是最後一位,則列印輸出
            for(i=0;i<N;i++)
                printf("%d\t",color[i]);
            printf("\n");
        }
    }
    
}

執行結果:


隨機挑選4種方案(圖中紅框框處的)進行驗證: