栈的应用之地图染四色问题

由四色定理,要使地图不同的相邻区域颜色不同,用四种不同的颜色就能实现。

首先,我们用邻接矩阵来存储“地图”。如果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]]);
	 }
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值