迷宫的简单实现

迷宫

使用一个二维数组模拟迷宫,在这里使用栈结构和回溯的算法简单实现迷宫。

给定一个入口,先将入口坐标入栈。再对四个方向进行判断,是否能走,如果能走将下一个节点入栈。当无路可走时,出栈节点,回溯到上一个节点进行上一步判断。当找到一个出口时
再回溯到上一个岔路口,寻找另外通路。

如果将所有节点出栈,则说明迷宫无出口。

//假设该迷宫为带环并且有多个出口一个入口
//假设1为迷宫的通路,0不可以走
int m[N][N] = {
	0, 0, 0, 0, 0, 0,
	0, 0, 1, 1, 1, 0,
	1, 1, 1, 0, 1, 0,
	0, 0, 1, 0, 1, 0,
	1, 1, 1, 1, 1, 1,
	0, 0, 1, 0, 0, 0 }

寻找迷宫的出口

int MazeGetPath2(pos entry)    //闯入入口的节点坐标,entry为坐标的结构体
{

	Stack p;
	Stack* path;
	int t1=0;
	pos cur;
	pos next;
	path = &p;
	path->top = -1;


	path->r[++path->top] = entry;  //将出发点入栈
	while (path->top != -1)   //若栈为空则证明无出口
	{


	
			 cur = path->r[path->top];//取栈定数据
			m[cur.row][cur.col] = 2;    //若是走过的数组便将值置为2
		
		if ((cur.col == 0 || cur.col == 5 || cur.row == 0 || cur.row == 5)&&(cur.col!=entry.col&&cur.row!=entry.row))  //出口位于数组边界且不等于入口
		{	
			t1++;
			printf("出口%d:%d %d\n",t1, cur.row, cur.col);
				path->top--;      //从出口回溯到岔路口,不断回溯将所有的路都走遍
				continue;	
		}
		//探测下一个位置,上下左右
		next = cur;
		next.row += 1;
		if (MazeChecklsAccess(&next))
		{
			path->r[++path->top] = next;
			continue;
		}
		next = cur;
		next.row -= 1;
		if (MazeChecklsAccess(&next))
		{
			path->r[++path->top] = next;
			continue;
		}
		next = cur;
		next.col -= 1;
		if (MazeChecklsAccess(&next))
		{
			path->r[++path->top] = next;
			continue;
		}
		next = cur;
		next.col += 1;
		if (MazeChecklsAccess(&next))
		{
			path->r[++path->top] = next;
			continue;
		}
		path->top--;  //如果走不通回溯到上一个节点
	} //回溯到上一个节点
	if (t1 == 0)   //t1为出口个数计数器没有一条出口
	{
		printf("无出口\n");
		return 0;
	}
else 
	return 1;    //若有出口返回1
}

`

结果
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值