栈求解迷宫问题

大家好啊,今天我们又来求解迷宫问题啦,上次我们使用的是队列求解出迷宫路线的最优解(感兴趣的朋友可以去看看喔,链接如下:https://blog.csdn.net/Nothing_Wzy/article/details/105549801)

目录如下可快速查阅

  • 算法描述
    • 队列
      • 建立迷宫
      • 试探变量
      • 进栈方式
      • 栈、栈变量的定义
      • 回溯
      • 结束
  • 程序清单
    • 建立栈的部分
    • 迷宫函数部分
    • 主函数调用部分
  • 运行结果
  • 结论

算法描述

同样是先建立迷宫后,再求解迷宫路线的思路,不过这次我们用栈来求解。
我们在这里将队列跟栈两种方式进行对比,方便理解。

队列

队列的方法很直接,将每一个点的上下左右四个方位中可以走的位置进队,并将其上一个位置进行记录,最终找到终点位置后我们根据记录以此找到上一点的坐,直至回到起点后,则其路线就找到了。相应示例如下:
栈求解迷宫问题_第1张图片
在此不做过多解释,感兴趣的可以去看我之前写的队列求解迷宫问题。

用栈求解的思路与队列不同,可以说用队列的解法很巧,相对的用栈求解就显得很暴力直接,下面我们来看具体思路:

建立迷宫

  1. 首先我们用一个二维数组建立迷宫地图( 其中1表示障碍,0表示可走坐标):
    栈求解迷宫问题_第2张图片

试探变量

  1. 然后我们在确保试探方向依次为上、右、下、左(顺时针方向),当然用其他顺序也可以,当时此时起点在左上角我们运行起来会更快一点(少走弯路):
    栈求解迷宫问题_第3张图片

进栈方式

  1. 然后从起点开始进栈,然后再开始循环对栈顶(此时为起点坐标)的周围四个方位进行试探,如果可以走,就直接将该点坐标进栈,并将方位变量赋值为-1(确保其能继续对四个方位进行试探):栈求解迷宫问题_第4张图片

栈、栈变量的定义

  1. 此时我们就能明白我们除了要定义栈之外,对进栈的变量也要进行定义,我们需要一个结构体来保存一个点的坐标(依次记录横坐标、纵坐标、方位变量):
typedef struct{
   
	int Row;	//行 
	int Column;	//列 
	int fang;	//方位变量 
}Position;

typedef struct {
   
	Position data[20];
	int top;
}Stack;

回溯

  1. 然后就考虑如果无路可走了,就回溯到上一个位置,又因为我们记录了方位变量,所以可以在回溯到上一个坐标后,继续试探剩下的方位。(如下我们回溯后对2自增后进行继续试探):栈求解迷宫问题_第5张图片

结束

  1. 直到最后我们的坐标到达终点位置,就结束循环,输出路线:
	if(e_r==8&&e_c==8)
		{
   
			DispStack();//输出地图
			return true;
		}
  1. 至此呢,我们的整个思路就完善了,那我们就可以将思路转换成代码。

程序清单

由于程序过于冗长,如果大家看的不清楚不明白的话可以评论私信告诉我,或者也可以去看看其他人的代码部分。

建立栈的部分

你可能感兴趣的:(迷宫问题,栈,c++,算法)