走出迷宫(用栈实现)

#include "mystack.h"
#include "position.h"
//随便给定一个迷宫,有障碍的地方赋值为1,无障碍的地方复制为0
//从左边进,右边出。在此迷宫中即在maze[1][0]进在maze[5][6]出
int maze[7][7] = { 1,1,1,1,1,1,1,
					0,0,1,0,0,0,1,
					1,0,1,0,1,1,1,
					1,0,0,0,1,0,1,
					1,0,1,0,0,0,1,
					1,0,1,0,1,0,0,
					1,1,1,1,1,1,1 };





int main()
{
	
	position now(1, 0);			//定义当前位置,即位于数组中的位置
	//定义怎样移动·····················
	position move[4];
	move[0].x = 0;  move[0].y = 1;  //向右移动
	move[1].x = 0;  move[1].y = -1;	//向左移动
	move[2].x = 1;  move[2].y = 0;	//向下移动
	move[3].x = -1;  move[3].y = 0;	//向上移动

	
	
	maze[1][0] = 1;				//阻止返回入口
	LinkStack<position> path;	//用于存储路径
	path.push(now);				//存入起点
	//开始移动················
	int choose = 0; int lastchoose = 3;
	while (now.x != 5 || now.y != 6)	//当不是出口时
	{
		int newx, newy;
		while (choose <= lastchoose)		//按照向右左下上的顺序寻找下一个可移动的位置
		{
			newx = now.x + move[choose].x;
			newy = now.y + move[choose].y;
			if (maze[newx][newy] == 0)
				break;
			else
				choose++;
		}
		if (choose <= lastchoose)//移动成功
		{
			now.x = newx;	now.y = newy;	//更新当前位置
			path.push(now);		//记录路径
			maze[newx][newy] = 1;	//防止倒退
			choose = 0;				//使之继续循环,寻找下一个可移动的位置,
		}
		else                     //没有找到可移动的位置,则回溯
		{
			if (path.empty())
				return false;
			else
			{
				position old;
				old = path.pop();	//在路径中删除当前位置
				now = path.gettop();	//返回上一位置
			}

		}
	}
	path.showstack();			//显示倒路径(这条路径是倒的)

	LinkStack<position> ver;
	while (!path.empty())
	{
		
		ver.push(path.pop());
	}
	cout << endl << endl;
	ver.showstack();		//显示路径(真正的路径)
	now = ver.pop();
	position next;
	while (!ver.empty())
	{
		next = ver.pop();
		if (now.x == next.x&&next.y>now.y)
			cout << "向右" << endl;
		if (now.x == next.x&&next.y<now.y)
		{
			cout << "向左" << endl;
		}
		if (now.x>next.x&&next.y == now.y)
		{
			cout << "向上" << endl;
		}
		if (now.x<next.x&&next.y == now.y)
		{
			cout << "向下" << endl;
		}
		now = next;
	}
	system("pause");
	return 0;
}

用栈实现的一个迷宫自动寻找出路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值