递归和栈求解迷宫的最短路径

本文介绍了使用递归和栈解决迷宫最短路径问题的方法,包括用栈保存有效路径、走过的路径以及最短路径。在遇到出口时,比较当前最短路径和新路径的长度,更新最短路径。然而,该方法可能因路径重复导致错误,因此需要改进标记已走过的路径的方式,避免错过潜在的最短路径。
摘要由CSDN通过智能技术生成

采用递归的方式求最短路径
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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值