题目描述:四色定理告诉我们,在地图上用四种不同的颜色给不同的行政区域染色,就能使得相邻的行政区域的颜色不同,现给你一张地图,请你给按照上述要求给地图染色。
解决思路:
①首先考虑的是如何将地图存储,我们只关心图与图之间的相邻关系,所以我们选择图的邻接矩阵来存储图,如果i区域和j区域相邻,那么我们就对[i][j]和[j][i]赋值为1,不相邻的区域赋值为0。
那么邻接矩阵如下:
{ 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;
for (j = 0; j < top; j++)
{
if (map[j][top] == 1 && stack[top] == stack[j])//如果相邻且颜色相同则返回1,不同返回0
{
return 1;
}
}
return 0;
}
int main()
{
char *colorarr[4] = { "red","green","blue","yellow" };//颜色数组
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;//颜色0
stack[top] = color;//第一块区域染色,颜色0入栈
top++;
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; //在原有颜色基础上尝试下一种颜色
}
}
for (int k = 0; k < 6; k++)
{
printf("The color of %dth is:%s\n", k+1, colorarr[stack[k]]);
}
return 0;
}
也就是: