用棧實現四種顏色對地圖的染色
阿新 • • 發佈:2019-01-30
數學上有個四色原理,對一個地圖而言,可以用四種顏色將地圖染色而且相鄰兩個國家顏色不同,下面使用C語言實現對一個簡單地圖的染色。程式碼如下:
#include <stdio.h> char map[7][7]={-1,1,1,1,1,1,0, 1,-1,0,0,0,1,0, 1,0,-1,1,1,0,1, 1,0,1,-1,1,0,0, 1,0,1,1,-1,1,0, 1,1,0,0,1,-1,0, 0,0,0,0,0,0,-1, }; //初始化地圖,map[i][j]=1表示第i+1,和j+1塊相連,0表示不相連,-1表示無意義 typedef struct _stack { int i; char a[7]; }stack; /*實現用4種顏色染色,要求相鄰的塊不同用同種顏色,下面 1 表示紫色 2表示黃色 3表示紅色,4表示綠色,每個區域按照上面四種顏色的順序進行染色,先暫定第一塊的 顏色為 1 ,對於後面,先尋找一個與前面相鄰塊不同的顏色,入棧,如果沒找到,將棧頂 顏色出棧,如果前面已經是 4 顏色,繼續退棧,否則當前顏色值上調,壓入棧 由於和前面相鄰節點比較是會破壞棧的封裝性,所以沒寫出它的操作,下面只是模擬了棧先進後出的性質而已而已*/ void dye() { stack s; int i=0,j,k,cur,t; char color,flag,flag_2=0; //flag_2檢測前面是否退棧,即是否向前回溯 s.i=-1; s.i+=1; s.a[i]=1; while(i<7) { t=1; if(flag_2) //如果發生退棧,這樣原來不是棧頂元素成為棧頂,顏色值增加 { t=s.a[i]+1; } for(j=t;j<=4;j++) { flag=1; for(k=0;k<=i;k++) { if(map[i+1][k]==1&&j==s.a[k]) //相鄰而且j顏色已經在與其相鄰的塊的被使用 { flag=0; break; } } if(flag) //找到合適的顏色與相鄰快顏色都不相同,將該顏色入棧 { color=j; s.i+=1; i=s.i; s.a[i]=color; break; } } flag_2=0; if(j>4) //沒有找到合適的顏色,退棧 { s.i-=1; i=s.i; flag_2=1; while(s.a[i]==4) //前面的一個塊也已經4種顏色都嘗試,繼續退棧 { s.i-=1; i=s.i; } if(i==-1) //如果棧空,表示找不到一種塗色方案 { printf("can't find any solution!\n"); return ; } } } for(j=0;j<7;j++) { char ch=s.a[j]; printf("%d:",j+1); switch(ch) { case 1: { printf("purple\n"); break; } case 2: { printf("yellow\n"); break; } case 3: { printf("red\n"); break; } case 4: { printf("green\n"); break; } } } } int main() { dye(); return 0; }
執行結果如下: