四色定理指出每個可以畫出來的地圖都可以至多用4種顏色來上色,而且沒有兩個相接的區域會是相同的顏色。被稱為相接的兩個區域是指他們共有一段邊界,而不是一個點。
主要原理:從第一個區域開始染色,到每一個區域依次遍歷相鄰的區域,若未出現重色則將該色入棧,遍歷下一個區域。若出現重色,進行換色直至四種顏色都出現重復,就回溯到上一個區域,更換顏色。
#include <iostream> using namespace std; #define NUM 100 //用圖存儲 typedef struct graph { int edges[NUM][NUM]; int v[NUM]; int vnum, edgenum; } Graph; //首先用鄰接矩陣作圖 v[i][j]=1表示倆個國家相鄰,v[i][j]=0表示不相鄰 void Coloring(Graph G) { int area = 1; //代表當前染色數量 給第一個點染色 顏色為1 國家序號為0——NUM-1 int nowcolor = 1; //當前顏色最大為4 //第一個地方染色為1 如果當前區域染色不沖突則上色后將頂點入棧,否則出棧進行再次染色 G.v[0] = 1; while (area < G.vnum) { while (nowcolor <= 4 && area < G.vnum) { int k = 1; //判斷是否重色 while (k < area && G.edges[area][k] * G.v[k] != nowcolor) { k++; } if (k == area) { //說明沒有重復則 G.v[area] = nowcolor; area++; nowcolor = 1; } else { nowcolor++; } } //回溯到上一個位置 換一個顏色繼續染 if (nowcolor > 4) { area--; nowcolor = G.v[area] + 1; } } }
