栈的应用——迷宫问题的求解

利用栈实现迷宫问题的求解(找到迷宫的通路,如下面给定的迷宫,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);
}

测试结果:

posted @ 2016-09-11 11:09  请叫我小小兽  阅读(948)  评论(0编辑  收藏  举报