C++超迷你迷宫

2018-07-20    来源:open-open

容器云强势上线!快速搭建集群,上万Linux镜像随意使用
#include <iostream>
#include <stack>
using namespace std;
#define _SIZE_ 10
typedef int Array[_SIZE_][_SIZE_];

struct Pos
{
    int x;
    int y;
    Pos(){}
    Pos(int val1,int val2):x(val1),y(val2){}
};//记录位置x,y,相当于记录的相应位置坐标。
struct Man
{
    Pos pos;
};

class Maze
{
    public:
Maze(int a[][_SIZE_])
    {
        for(int i=0;i<_SIZE_;i++)
        {
            for(int j=0;j<_SIZE_;j++)
            {   
                arr[i][j] = a[i][j];
            }
        }
  }

void Printf()
    {
        for(int i=0;i<_SIZE_;i++)
        {
            for(int j=0;j<_SIZE_;j++)
            {
                cout<<arr[i][j]<<" ";
            }
            cout<<endl;
        }
    }   

 void InitGrial(const Pos &start,const Pos &end)
    {
        Man man;
        man.pos.x = start.x;
        man.pos.y = start.y;
    //  man.kind = RIGHT;
        stack<Man> st;
        stack<Man> sh;
        st.push(man);//此处才把起始位置放进栈st里面。
        Postion(man);//记住man走过的足迹.
        while(!st.empty())
        {
            Pos NewPos;
            Man man = st.top();
            if (InitNewPos(NewPos,man))
            {                   
            Man NewMan;
            NewMan.pos = NewPos;
            st.push(NewMan);
            Postion(NewMan);
            if(NewMan.pos.x==end.x && NewMan.pos.y==end.y)break;
            }
            else
            {
                sh.push(st.top());
                st.pop();
            }
        }   
        while(!sh.empty())
        {
            Man man = sh.top();
            arr[man.pos.x][man.pos.y]=0;
            sh.pop();
        }
    }
    bool InitNewPos(Pos &pos,Man &man)
    {
        if(arr[man.pos.x][man.pos.y+1]==0)
             {
                pos.x=man.pos.x;
                pos.y=man.pos.y+1;
                return true;
             }
        if(arr[man.pos.x+1][man.pos.y]==0)
            {
            pos.x=man.pos.x+1;
            pos.y=man.pos.y;
            return true;
            }
        if(arr[man.pos.x][man.pos.y-1]==0)
            {
            pos.y = man.pos.y-1;
            pos.x = man.pos.x;
            return true;
            }
        if(arr[man.pos.x-1][man.pos.y]==0)
            {
            pos.x = man.pos.x-1;
            pos.y = man.pos.y;
            return true;        
            }
        return false;
    }
    void Postion(Man &man)
    {
        arr[man.pos.x][man.pos.y]=2;
    }
    private:
    Array arr;
};

int main()
{
    int a[][10]=
            {1,0,1,1,1,1,1,1,1,1,
             1,0,0,0,0,0,1,1,0,1,
             1,0,1,1,1,0,0,1,0,1,
             1,0,0,1,1,1,0,0,0,1,
             1,1,0,1,1,1,1,0,0,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,1,1,1,1,
             1,1,1,1,1,0,0,0,1,1,
       1,1,1,1,1,1,1,0,1,1};        
    Maze ma(a);
    Pos start(0,1);
    Pos end(9,7);//定义开始的位置以及结束的位置。

    ma.InitGrial(start,end);
 //然我们开始吧,实在想不出名字了,Grial是圣杯的意思.

    ma.Printf();    
    return 0;
}

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

上一篇:C++红黑树的实现

下一篇:C语言实现汉诺塔算法