数据结构—迷宫求解

迷宫:根据迷宫中通路的数量和路的特点,可将迷宫分为三类

  • 简单迷宫
  • 多通路迷宫(通路间不带环)
  • 多通路迷宫(通路间带环)

不管是哪种迷宫,通常我们要解决的问题是找出通路,通常还得找到最短的那条通路,这里我们先说如何找到一条通路,等这个问题解决之后再说说如何找到最短的那条通路

找迷宫通路

找迷宫通路需要使用回溯法,找迷宫通路是对回溯法的一个很好的应用,实现回溯的过程用到了数据结构—栈 

回溯法:对一个包括有很多个结点,每个结点有若干个搜索分支的问题,把原问题分解为若干个子问题求解的算法;当搜索到某个结点发现无法再继续搜索下去时,就让搜索过程回溯(回退)到该节点的前一个结点,继续搜索该节点外的其他尚未搜索的分支;如果发现该结点无法再搜索下去,就让搜索过程回溯到这个结点的前一结点继续这样的搜索过程;这样的搜索过程一直进行到搜索到问题的解或者搜索完 了全部可搜索分支没有解存在为止。

问题分析:

代码实现: 

void InitMaze(Maze* m, int map[ROW][COL])  //迷宫的初始化
{
	for (int i = 0;i< ROW ;++i)
	{
		for (int j = 0; j < COL; ++j)
		{
			m->map[i][j] = map[i][j];
		}
	}
}
void PrintMaze(Maze* m)  //打印迷宫
{
	for (int i = 0; i < ROW; ++i)
	{
		for (int j = 0; j < COL; ++j)
		{
			printf("%d ",m->map[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}

int IsValidEnter(Maze* m, Position cur)  //判断是否是有效的入口
{
	assert(m);

	if ((cur._x == 0 || cur._x == ROW - 1)
		|| (cur._y == 0 || cur._y == COL - 1)
		&& (m->map[cur._x][cur._y] == 1))
		return 1;
	else
		return 0;
}

int IsNextPass(Maze* m,Position cur, Position next) //判断当前节点的下一个节点能不能走通
{
	assert(m);

	//这里有必要判断一下他给的节点在不在迷宫里面
	if (((next._x >= 0 && next._x < ROW) || (next._y >= 0 && next._y < COL))
		&&(m->map[next._x][next._y] == 1))
		return 1;
	else
		return 0; 
}

int IsExitPosition(Maze* m, Position cur,Position enter)  //判断当前节点是不是迷宫的出口
{
	assert(m);

	//这里首先得保证该节点不是入口点,其次只要它处在迷宫的边界即可
	if ((cur._x  != enter._x || cur._y != 
  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值