采用递归的方式求最短路径
1、用一个栈专门用来保存有效的路径
2、再用一个栈来辅助保存所有走过的路径。
3、然后再用一个栈用来保存最短的路径
4、如果每次找到了出口,那么必然有两个栈一个保存了所有走过的路径,一个保存了通路的路径
5、于是每找到一次出口,那么开始进行比较,如果当前最短路径中所保存的每个坐标的个数如果大于本次通路的路径,那么就将最短路径中的所有数据出栈,并将本次通路的路径放入最短路径的栈中,然后开始把本次路径的出口堵死,将其他走过的路径全部初始化为原始状态(也就是将所有走过的所有路径再次全部标记成可以走的)
6、然后继续递归调用找路径的这个函数,直到所有路径都找完了,仍旧没有出路。就开始一层一层的往回返。
#include<iostream>
#include<stdlib.h>
#include<assert.h>
#include<stack>
#pragma warning(disable:4996)
using namespace std;
class Pos
{
public:
Pos(int x=0, int y=0)
:_row(x)
,_col(y)
{
}
int _row;
int _col;
};
class Maze
{
public:
Maze();
~Maze();
void InitMap();
bool CheckIsPath(Pos seat);
bool GetMazePath();
void PrintMap();
int _row;
int _col;
int **_map;//存放迷宫的地图,使用二级指针来保存二维数组
Pos _entry;
Pos **_path;
stack<Pos>_shortpath;
int row;
int col;
};
Maze::Maze()
:_row(0)
, _col(0)
, _map(NULL)
, _entry(0,0)
{
}
Maze::~Maze()
{
if (_map)
{
for (int i = 0; i < _row; i++)
{
delete[] _map[i];
}
delete _map;
_map = NULL;
}
}
void Maze::InitMap()
{
char ch;
FILE* fp = fopen("maze.txt", "r");
assert(fp);
while ((ch = fgetc(fp)) != ' '&&ch != '\n')
{
_row = _row * 10 + ch - '0';
}
while ((ch = fgetc(fp)) != ' '&&ch != '\n')
{
_col = _col * 10 + ch - '0';
}
while ((ch = fgetc(fp)) != ' '&&ch != '\n')
{
_entry._row = _entry._row * 10 + ch - '0';
}
while ((ch = fgetc(fp)) != ' '&&ch != '\n')
{
_entry._col = _entry._col * 10 + ch - '0';
}
_map = new int*[_row];
for (int i = 0; i < _row; i++)
{
_map[i] = new