四色定理指出每个可以画出来的地图都可以至多用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; } } }