天天看點

迷宮求解(棧實作)迷宮求解(棧實作)

迷宮求解(棧實作)

自己寫的,外面别人的看了一下,感覺不少都是遞歸解決這類問題的,然後我嘗試用非遞歸解決的。混合了類的運用,多說不如直接上代碼了。

#include<iostream>
#include<stdio.h>
#include<stack>
#define M 8
using namespace std;
struct Pos {
int i;
int j;
};
class Maze{
    public:
    Maze()=default;
    Maze(int a1,int b1,int a2,int b2)
    {
        start_.i=a1;
        start_.j=b1;
        end_.i=a2;
        end_.j=b2;
    }
    ~Maze()=default;
    void CreateMaze();
    void PrintMaze();
    bool MakeIt();
    private:
        int Ma_ze[M][M];
        Pos start_;
        Pos end_;
};

void Maze::CreateMaze( )
{
    int i=,j=;
    int a=;
    for (i=;i<M;i++)
    {
        for (j=;j<M;j++)
        {
         cin>>a;
         Ma_ze[i][j]=a;
        }
    }
    Ma_ze[start_.i][start_.j]=;
}

void Maze::PrintMaze( )
{
    int i=,j=;
    for (i=;i<M;i++)
    {
        for (j=;j<M;j++)
        {
         if (Ma_ze[i][j]==)
         {
             cout<<"●";
         }
         else if(Ma_ze[i][j]==)
         {
             cout<<"  ";
         }
         else if (Ma_ze[i][j]==)
         {
             cout<<"**";
         }
        }
        cout<<endl;
    }
}
bool Maze::MakeIt()//完成路徑尋找
{
    bool issuccess=false;
    stack <Pos> make;
    Pos alit,blit;
    make.push(start_);
    while ()
    {
        if (make.empty()==true)
        {
            break;
        }
        alit=make.top();
        //cout<<alit.i<<"  "<<alit.j<<endl;
        //make.pop();
        if (Ma_ze[alit.i+][alit.j]==)
        {
            blit.i=alit.i+;
            blit.j=alit.j;
            Ma_ze[alit.i+][alit.j]=;
            if (blit.i==end_.i&&blit.j==end_.j)
            {
                issuccess=true;
                break;
            }
            make.push(blit);
        }
        else  if (Ma_ze[alit.i][alit.j+]==)
        {
            blit.i=alit.i;
            blit.j=alit.j+;
            Ma_ze[alit.i][alit.j+]=;
            if (blit.i==end_.i&&blit.j==end_.j)
            {
                issuccess=true;
                break;
            }
            make.push(blit);
        }
        else  if (Ma_ze[alit.i-][alit.j]==)
        {
            blit.i=alit.i-;
            blit.j=alit.j;
            Ma_ze[alit.i-][alit.j]=;
               if (blit.i==end_.i&&blit.j==end_.j)
            {
                issuccess=true;
                break;
            }
            make.push(blit);
        }
        else  if (Ma_ze[alit.i][alit.j-]==)
        {
            blit.i=alit.i;
            blit.j=alit.j-;
            Ma_ze[alit.i][alit.j-]=;
            if (blit.i==end_.i&&blit.j==end_.j)
            {
                issuccess=true;
                break;
            }
            make.push(blit);
        }
        else
        {
            make.pop();
        }
    }
    return issuccess;
}

int main()
{
    Maze m(,,,);
    freopen("maze.txt","r",stdin);
    m.CreateMaze();
    m.PrintMaze();
    if (m.MakeIt()==true)
    {
        m.PrintMaze();
    }
    else
    {
        cout<<"error"<<endl;
    }
}
           

這是測試用的資料,“2”表示牆壁,“0”表示可以走。

2 2 2 2 2 2 2 2

2 0 0 2 0 2 0 2

2 2 0 0 0 0 0 2

2 0 0 2 0 2 0 2

2 2 2 2 0 2 0 2

2 2 0 0 0 2 0 2

2 0 0 2 0 0 0 2

2 2 2 2 2 2 2 2

反思就是代碼還有很多可以寫的更簡潔的地方,比較懶想等到以後了。