栈应用之地图染色(C语言)

题目描述:四色定理告诉我们,在地图上用四种不同的颜色给不同的行政区域染色,就能使得相邻的行政区域的颜色不同,现给你一张地图,请你给按照上述要求给地图染色。
在这里插入图片描述

解决思路
①首先考虑的是如何将地图存储,我们只关心图与图之间的相邻关系,所以我们选择图的邻接矩阵来存储图,如果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;
}

在这里插入图片描述
也就是:
在这里插入图片描述

  • 5
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值