由四色定理,要使地图不同的相邻区域颜色不同,用四种不同的颜色就能实现。
首先,我们用邻接矩阵来存储“地图”。如果i区域和j区域相邻,那么我们就对[i][j]和[j][i]赋值为1。
{ 0, 1, 1, 1, 1, 1,
1, 0, 1, 0, 1, 0,
1, 1, 0, 1, 1, 1,
1, 0, 1, 0, 0, 1,
1, 1, 1, 0, 0, 1,
1, 0, 1, 1, 1, 0 }
实现方法:
每一个区域的染色用0,1,2,3逐个尝试,如果染色与相邻区域的颜色不同,就将此颜色入栈。如果染色与相邻区域的颜色相同,则尝试下一个颜色。如果尝试到最后仍然颜色相同,则退栈至上一个区域,看此区域是否可染其他颜色,若能,则换色后继续对下一区域染色,若不能,则再退栈至上一区域,看是否能染其他颜色…如此循环,直至所有区域染色成功。
#include <stdio.h>
int detection(int map[6][6], int stack[], int top)
{
int j=0;
for(j=0;j<6;j++)
{
if(map[j][top]==1 && stack[top]==stack[j]) //如果相邻且颜色相同则返回1,不同返回0
return 1;
}
return 0;
}
int main()
{
char *colorarray[4] = { "red","yellow","blue","green" };//颜色数组
int map[6][6] =
{ 0, 1, 1, 1, 1, 1,
1, 0, 1, 0, 1, 0,
1, 1, 0, 1, 1, 1,
1, 0, 1, 0, 0, 1,
1, 1, 1, 0, 0, 1,
1, 0, 1, 1, 1, 0 };//存储地图的邻接矩阵
int stack[6]; //定义栈
int top = 0;
int color=0; //颜色
stack[top++] = color; //第一块区域染色,颜色0入栈
while(top<6)
{
while(color<4 && top<6)
{
stack[top] = color; //由0开始染色
while(detection(map, stack, top)) //如果检验撞色
{
color++;
stack[top] = color; //继续尝试下一颜色
}
if(color<4) //如果颜色符合范围
{
top++; //将颜色入栈
color=0; //颜色重置为0
}
}
if(color>=4) //颜色不符合条件就要开始回溯
{
top--;
color=stack[top]+1; //在原有颜色基础上尝试下一种颜色
}
}
int k=0;
for(k=0;k<6;k++)
{
printf("The color of %dth is:%s\n",k+1,colorarray[stack[k]]);
}
}
运行结果: