数据结构::迷宫(二)--栈的一个应用(求迷宫最短路径)

      上篇文章我们知道求解迷宫通路的方法,但是一个迷宫有时是不止一条出路,在这些出路中,我们如何找到最短的那一条,这就是我今天要说的迷宫最短路径问题。

(此处使用的图):

数据结构::迷宫(二)--栈的一个应用(求迷宫最短路径)_第1张图片

【先来分析有什么解决方案:】

1、方法一我们如果采用上章中递归的方式,将所走的路用2标记起来,此时如果找到一条路后,要进行回溯递归,但是到可以走的环中就出现问题了,说的有点迷糊是吧,我把图抛出来。

数据结构::迷宫(二)--栈的一个应用(求迷宫最短路径)_第2张图片

在这张图中我们可以看到,如果我们递归到又有一个可以走的路,就是圆圈2,那么上面蓝色线指的就走不回去了,因为已经走过了。所以这种方法是不可取的。有这方面的缺陷。

2、方法二:还是利用递归,但是我们做法不同

1)、每走一步标记的数值加1
2)、利用递归进行探测
3)、当找到一条路的时候,回溯递归
4)、此时,当探测的位置可以通的话,就继续走,将下一位置标记数值加1
(为了防止回去,原则就是不能走比他数值小的位置)

【我们就采用第二种方案,来看怎么实现】:

#include
#include
#include
using namespace std;
#define N 10
//const size_t N = 10;

//迷宫中所走的位置表示
struct Pos
{
   /* size_t*/ int _row;  //所在位置的行
	/*sizt_t*/int _col;  //所在位置的列
};

//获取迷宫
void GetMaze(int* maze,size_t n)
{
	FILE* fp = fopen("2.txt","r");  //先通过相对路径打开存储迷宫地图的文本
	assert(fp);       //打开文本是否成功
	for(size_t i = 0; i=0 && pos._row=0 && pos._coln &&
		next._col<=0 && next._col>n &&
		maze[next._row*n+next._col] == 1)
	{
		return false;
	}
	//这个位置如果是0
	if(maze[next._row*n+next._col] == 0)
	{
		return true;
	}
	//下一个位置要大于上一个位置加1(原则)
	if(maze[next._row*n+next._col] > maze[cur._row*n+next._col]+1)
	{
		return true;
	}
	return false;
}
//求解迷宫路径
void GetMazePath_r(int* maze,size_t n,Pos entry,stack& path,stack& shortpath)
{
	assert(maze);
	path.push(entry);
	Pos cur;    
	Pos next;
    cur = entry;
	maze[cur._row*n+cur._col] = 2;   //把走过的这个位置进行标记
	next = cur;
	if(next._row == n-1) //找到了一条路
	{
		if(shortpath.empty() || path.size() path;
	Pos entry = {2,1};
	stack shortpath;
	//输出迷宫
	GetMaze((int*)maze,N);
	GetMazePath_r((int*) maze,N,entry,path,shortpath);
	Print((int*) maze,N);
    cout<<"是否找到迷宫:"<

说了这么多,机智的你应该掌握了吧。

你可能感兴趣的:(数据结构)