栈的应用———迷宫问题

一、简单的有一条活路的迷宫

算法描述:
《栈的应用———迷宫问题》

#include <iostream>
#include <stack>
using namespace std;
struct Seat     // 坐标位置
{
    Seat(int x, int y)
    :_x(x)
    , _y(y)
    {}
    int _x;
    int _y;
};
#define ROW 10
#define COL 10

class Masze
{
public:
    Masze(int map[][COL])
    {
        for (int i = 0; i < ROW; ++i)
        {
            for (int j = 0; j < COL; ++j)
            {
                _map[i][j] = map[i][j];
            }
        }
    }
    bool IsPass(const Seat& s)      //判断下一步是否能走
    {
        if ((_map[s._x][s._y] == 1)|| IsExit(s))
            return true;
        return false;
    }
    bool IsExit(const Seat& s)   // 判断是否为出口
    {
        if (s._x < 0 || s._x >= ROW || s._y < 0 || s._y >= COL)
        {
            return true;
        }
        return false;
    }
    bool PassMaze(Seat& enter)     // 迷宫是否能走通
    {    

        if (_map[enter._x][enter._y] != 1)
        {
            return false;
        }
        stack<Seat> s;
        s.push(enter);
        while (!s.empty())
        {
            Seat Cur = s.top();
            if (IsExit(Cur))
            {
                return true;
            }
            _map[Cur._x][Cur._y] = 2;

            Seat up(Cur._x-1, Cur._y);
            if (IsPass(up))
            {
                s.push(up);
                continue;
            }
            Seat left(Cur._x , Cur._y - 1);
            if (IsPass(left))
            {
                s.push(left);
                continue;
            }
            Seat right(Cur._x, Cur._y + 1);
            if (IsPass(right))
            {
                s.push(right);
                continue;
            }
            Seat down(Cur._x + 1, Cur._y);
            if (IsPass(down))
            {
                s.push(down);
                continue;
            }
            _map[Cur._x][Cur._y] = 3;
            s.pop();
        }
        return false;
    }
    void PrintMap()
     {
            for (int i = 0; i < ROW; ++i)
            {
                for (int j = 0; j < COL; ++j)
                {
                    cout << _map[i][j] << " ";
                }
                cout << endl;
            }

            cout << endl;
    }


private:
    int _map[ROW][COL];
};

int main()
{
    int arr[ROW][COL] = {
        { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
        { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
        { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
        { 0, 0, 0, 0, 0, 1, 1, 1, 0, 0 },
        { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },
        { 0, 0, 0, 0, 0, 0, 1, 1, 0, 0 },
        { 0, 0, 0, 0, 0, 0, 0, 1, 1, 0 },
        { 0, 0, 0, 0, 0, 0, 1, 0, 1, 0 },
        { 0, 0, 0, 0, 0, 1, 1, 1, 1, 0 },
        { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 }
    };
    Masze m(arr);
    Seat enter(9, 5);
    m.PassMaze(enter);
    m.PrintMap();


    return 0;
}

运行之:

《栈的应用———迷宫问题》
二。多条通路最短路问题

《栈的应用———迷宫问题》

#include <stack>
#include <iomanip>
#include <vector>
using namespace std;
struct Seat             // 位置坐标
{
    Seat(int x, int y)
    :_x(x)
    , _y(y)
    {}
    bool operator==(const Seat& s)
    {
        return (_x == s._x) && (_y == s._y);
    }
    bool operator!=(const Seat& s)
    {
        return !(*this == s);
    }
    int _x;
    int _y;


};



class Masze
{
public:
    Masze(int* map, int row, int col)     //利用vector创建二维数组
        :_row(row)
        , _col(col)
    {
        _map.resize(row);                       // 给出行 
        /*_map = new int*[row];*/
        for (int i = 0; i < row; ++i)  
        {
            _map[i].resize(col);            //每一行的的列
            /*_map[i] = new int[col];*/
            for (int j = 0; j <_col; ++j)
            {
                _map[i][j] = map[col*i + j];
            }
        }
    }
    bool IsPass(const Seat& cur, const Seat& next)     //判断下一步可不可以走
    {
        /*if (IsExit(cur)) return false;*/
        if (_map[next._x][next._y] == 0)       // 0 为死路
            return 0;
        if ((_map[next._x][next._y] == 1))     // 1 为活路
            return true;
        else if ((_map[cur._x][cur._y] < _map[next._x][next._y]) && (_map[cur._x][cur._y] + 1 != _map[next._x][next._y]))
            return true;                              // 当前步小于下一步可以走与不是走过的路
        return false;
    }
    bool IsExit(const Seat& s)
    {
        if (s._x == 0 || s._x == _row - 1 || s._y == 0 || s._y  == _col - 1)    // 判断是不是出口
        {
            return true;
        }
        return false;
    }
    bool PassMaze(Seat& enter)          // 迷宫是否能走出去
    {

        if (_map[enter._x][enter._y] != 1)   //检测入口
        {
            return false;
        }
        stack<Seat> s;           // 保存走过每一步
        stack<Seat> shortpath;   //保存最短路
        s.push(enter);          
        bool flag = false;
        while (!s.empty())      // 最后从入口点退出
        {
            Seat Cur = s.top();   

            if (flag  && IsExit(Cur))                     // 第一步不是出口 && 判断出口
            {   
                if (Cur != enter)                            // 最后为入口点 出口不等于入口 
                if (shortpath.empty() || (s.size() < shortpath.size()))   // 将最短路放在shortpatn里
                {
                    shortpath = s;
                }

                if (!s.empty())
                s.pop();                                               // 到出口退栈
                continue;
            }
            if (!flag && Cur == enter)  // 先走第一步 但不是最后一步
            {
                _map[Cur._x][Cur._y] = _map[Cur._x][Cur._y] + 1; //下一步为当前步加1
                flag = true;

            }
            Seat up(Cur);
            up._x -= 1;
            if (IsPass(Cur ,up))                    // 向上走
            {
                _map[up._x][up._y] = _map[Cur._x][Cur._y] + 1;
                s.push(up);
                continue;
            }
            Seat left(Cur._x, Cur._y - 1);  // 向左走
            if (IsPass(Cur, left))
            {
                _map[left._x][left._y] = _map[Cur._x][Cur._y] + 1;
                s.push(left);
                continue;
            }
            Seat right(Cur._x, Cur._y + 1);  //向右走
            if (IsPass(Cur, right))
            {
                _map[right._x][right._y] = _map[Cur._x][Cur._y] + 1;
                s.push(right);
                continue;
            }
            Seat down(Cur._x + 1, Cur._y);  //向下走
            if (IsPass(Cur ,down))
            {
                _map[down._x][down._y] = _map[Cur._x][Cur._y] + 1;
                s.push(down);
                continue;
            }

            s.pop();  // 上下左右都不能走退栈
        }
        if (!shortpath.empty())
            return true;

        return false;
    }
    void PrintMap()
    {
        for (int i = 0; i < _row; ++i)
        {
            for (int j = 0; j < _col; ++j)
            {
                cout << setw(5)<<left<<_map[i][j] ;
            }
            cout << endl;
        }

        cout << endl;
    }


private:
    vector<vector<int>>  _map;

    int _row;
    int _col;
};

int main()
{
    int arr[10][10] = {
        { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
        { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
        { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
        { 0, 0, 0, 0, 0, 1, 1, 1, 0, 0 },
        { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },
        { 0, 0, 0, 0, 0, 0, 1, 1, 0, 0 },
        { 0, 0, 0, 0, 0, 0, 0, 1, 1, 0 },
        { 0, 0, 0, 0, 0, 0, 1, 0, 1, 0 },
        { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 },
        { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 }
    };
    Masze m((int*)arr, 10, 10);
    Seat enter(9, 5);

    cout << m.PassMaze(enter) << endl;
    m.PrintMap();


    return 0;
}

运行之:

《栈的应用———迷宫问题》

    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/L_listen/article/details/78577889
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞