zoukankan      html  css  js  c++  java
  • 栈的应用——迷宫问题的求解

    利用栈实现迷宫问题的求解(找到迷宫的通路,如下面给定的迷宫,0代表通路,1代表不通,利用栈的特点,求出他的通路)

    给定的迷宫:

    1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1
    0 0 0 1 1 1 1 1 1 1
    1 1 0 1 1 1 1 1 1 1
    1 1 0 1 1 1 1 1 1 1
    1 1 0 1 1 1 1 1 1 1
    1 1 0 0 0 0 0 0 1 1
    1 1 0 1 1 1 1 0 1 1
    1 1 0 1 1 1 1 0 1 1
    1 1 0 1 1 1 1 1 1 1

    自己实现的栈

    #include<iostream>
    using namespace std;
    #include<assert.h>

    template<class T>
    class Stack
    {
    public:
        Stack()
            :_capacity(0)
            ,_data(NULL)
            , _top(0)
            
        {}

        ~Stack()
        {
            delete[] _data;
            _data = NULL;
            _top= _capacity = 0;
        }

        void Push(const T&x)
        {
            _CheckCapacity();
            _data[_top++] = x;
        }
        void Pop()
        {
            if (!IsEmpty())
            --_top;
        }
        bool IsEmpty()
        {
            return _top == 0;
        }
        bool IsFull()
        {
            return _top == _capacity;
        }

        T& Top()
        {
            return _data[_top-1];
        }

        void Display()
        {
            for (int i = 0; i < _top; ++i)
            {
                cout << _data[i] << " ";
            }
            cout << endl;
        }
    public:
        void _CheckCapacity()
        {
            if (_top >= _capacity)
            {
                size_t NewCapacity = 2 * _top + 3;
                T* tmp = new T[NewCapacity];
            //    memcpy(tmp, _data, sizeof(T)*size);   //内置类型
                for (int i = 0; i <_top; ++i)
                {
                    tmp[i] = _data[i];
                }
                delete[] _data;
                _data = tmp;
                _capacity = NewCapacity;
            }
        }
    private:
        T* _data;
        size_t _top;
        size_t _capacity;
    }

    ///////////////////////////////////////////////////////////////////

    迷宫的几种操作:

    #include"Stack.h"
    const int N = 10;

    struct Pos
    {
        int _row;
        int _col;

        Pos(int row=0,int col=0)
            :_row(row)
            ,_col(col)
        {}
    };
    void InitMaze(int *Maze)   //初始化迷宫
    {
        FILE* fp = fopen("Maze.txt", "r");
        assert(fp);

        for (int i = 0; i < N; ++i)
        {
            for (int j = 0; j < N; )
            {
                int value = fgetc(fp);
                if (value ==32 || value == 10)
                    continue;
                    Maze[i*N + j] = value - '0';
                ++j;
            }
        }
    }

    bool CheckAccess(int *Maze,Pos p,int rows,int cols)
    {
        return (p._col >= 0 && p._col < cols&&p._row >= 0 && p._row < rows&&Maze[p._row*rows+ p._col] == 0);
    }


    bool GetPath(int *Maze, int cols, int rows, Stack<Pos>&s, Pos entry)
    {    
        Pos cur = entry;
        s.Push(entry);
        Maze[entry._row*rows+ entry._col] = 2;  //走过的路径被设为2
        while (!s.IsEmpty())
        {
              Pos next = s.Top();
               cur = next;
                Maze[cur._row*rows + cur._col] = 2;

                if (next._row == rows-1 || next._col == cols-1)  //3面可以出
                    return true;


                //右
                next._col = next._col + 1;
                if (CheckAccess(Maze, next, N, N))
                {
                    s.Push(next);
                    continue;
                }
                next._col = next._col - 1;

                //下
                next._row = next._row + 1;
                if (CheckAccess(Maze,next,N,N))
                {
                    s.Push(next);
                    continue;
                }
                next._row = next._row - 1;

                //上
                next._row = next._row - 1;
                if (CheckAccess(Maze, next, N, N))
                {
                    s.Push(next);
                    continue;
                }
                next._row = next._row + 1;

                //左
                next._col = next._col - 1;
                if (CheckAccess(Maze, next, N, N))
                {
                    s.Push(next);
                    continue;
                }
                next._col = next._col + 1;

                //右
                next._col = next._col + 1;
                if (CheckAccess(Maze, next, N, N))
                {
                    s.Push(next);
                    continue;
                }
                next._col = next._col - 1;

                s.Pop();                      
                Maze[next._row * rows+ next._col] = 3;      //如果走过的路径不通,则标记为3
            }
            return false;
    }

    void PrintMaze(int *Maze)
    {
        for (int i = 0; i < N; ++i)
        {
            for (int j = 0; j < N; ++j)
            {
                cout << Maze[i*N + j] << " ";
            }
            cout << endl;
        }
        cout << endl;
    }

    ///////////////////////////////////////////////////////

    测试:

    #include"Maze.h"
    void main()
    {
        int maze[N][N];
        InitMaze((int *)maze);
        PrintMaze((int *)maze);

        Stack<Pos> paths;
        cout << "是否有通路?" <<GetPath((int *)maze, N, N, paths, Pos(2, 0)) << endl;
        //cout << "是否有通路?" << GetPath( N, N,(int *)maze, paths, Pos(2, 0)) << endl;
        PrintMaze((int *)maze);
    }

    测试结果:

  • 相关阅读:
    WebService-CXF 学习笔记
    Java中对于ClassLoader类加载器 嵌套了深度技术的价值
    WebService学习笔记
    MongoDB学习笔记
    java.io.IOException: java.io.FileNotFoundException: /tmp/tomcat.2457258178644046891.8080/work/Tomcat/localhost/innovate-admin/C:/up/154884318438733213952/sys-error.log (没有那个文件或目录)
    Node Sass does not yet support your current environment: Linux 64-bit with Unsupported runtime
    Mysql优化
    SI架构设计与实践
    高并发高可用处理大数据量
    虚拟机安装CentOS详细操作
  • 原文地址:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/5861271.html
Copyright © 2011-2022 走看看