圖的四色著色(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
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種方案(圖中紅框框處的)進行驗證: