迷宫c++利用栈空间回溯法

利用栈空间储存迷宫路径可以有效保证回溯上一位置时的方便和可靠性。
算法最应注意的是应该在路径入栈后,设置该坐标为0(不可走),防止不停重复入栈和出栈,形成死循环。
在这里插入图片描述
该代码的迷宫代码如图所示,注意如果没有设置入栈位置为0的话,会在(1,2)(1,3)坐标处产生死循环。因为代码没有设置变量,因此如修改本代码,请重新设置该代码的数组大小,迷宫如不存在正确路径,程序会崩溃。


#include<iostream>

using namespace std;
typedef struct stack
{
	int arr[16][2];//使用二维数组保存路径的位置
	int p;
}stacktype;//别名设置
int arr[4][4] = { {1,1,0,0},{0,1,1,1},{0,0,1,0},{0,0,1,1} };//迷宫的初始化,利用二维数组来模拟横纵坐标
void push(stack* s, int x,int y);//插入栈
void pop(stack* s,int x, int y);//出栈
void advance(stack* s,int x, int y );
int  gety(stack* s);
int  getx(stack* s);
void road(stack* s);
int main()
{
	int x, y;
	x = y = 0;
	stack* s = new stack;
	s->p = -1;
	while (1)
	{
		advance(s, x, y);
		x = getx(s);
		y = gety(s);
	if (x == 3 && y == 3)//迷宫的出口位置,根据迷宫设置
	{
	cout << "找到出口路径为:"<<endl;
	road(s);
	
	
	break;
	}
	}
	
	cout << "游戏结束";
	delete s;

	return 0;
}

void advance(stack* s,int x, int y)//判断右下左上有没有‘1’可走的路径有的话入栈保存路径
{
	 if (arr[x][y + 1] == 1)//右
	 {   
		push(s, x, ++y);

	 }
	else if (arr[x + 1][y] == 1)//下
	{
		push(s,++x,y);
		
	}
	else if (arr[x][y - 1] == 1)//左
	{
		push(s,x,--y);
		
	}
	else if (arr[x - 1][y] == 1 )//上
	{
		push(s,--x,y);
		
	}

	
	else//没有可行路径,则弹出栈空间后在上一个位置再次寻找
	{
		 pop(s, x, y);
	}
	
}

void push(stack* s, int x, int y)//入栈并保存x,y坐标,并且入栈后设置该为位置为0防止坐标出现重复入栈。
	{
		s->p++;
		s->arr[s->p][0] = x;
		s->arr[s->p][1] = y;
		arr[x][y] = 0;

	}

	void pop(stack * s,int x,int y)//出栈并且
	{
		

		s->p--;
			
	}
	int  getx(stack* s)//获取x坐标
	{
		
		return s->arr[s->p][0];
	}
	int  gety(stack* s)//获取y坐标
	{

		return s->arr[s->p][1];
	}

void road(stack* s)//反向打印路径
{
	while(s->p>-1)
	{

		cout << s->arr[s->p][0] << "," << s->arr[s->p][1] << endl;
		s->p--;
	}
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值