迷宮求解(棧實作)
自己寫的,外面别人的看了一下,感覺不少都是遞歸解決這類問題的,然後我嘗試用非遞歸解決的。混合了類的運用,多說不如直接上代碼了。
#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
反思就是代碼還有很多可以寫的更簡潔的地方,比較懶想等到以後了。