迷宫问题解决(栈)






该迷宫可以自己变幻大小和方块顺序,其中1代表迷宫的墙,0代表迷宫的通道


#include <iostream>


using namespace std;
const int Length=4,Width=4;
int puzzle[Length+2][Width+2]=
{
    {1,1,1,1,1,1},
    {1,0,0,0,1,1},
    {1,0,1,0,0,1},
    {1,0,0,0,1,1},
    {1,1,0,0,0,1},
    {1,1,1,1,1,1}
};
    typedef struct
    {
        int i;//当前的方块的行号
        int j;//当前方块的列号
        int di;//下一个可走的相邻的方块的方位号
    }Box;//定义方块类型
    typedef struct
    {
        Box data[100];
        int top;//栈顶指针
    }StType;//定义顺序栈类型
int main()
{
    void Mg_Solve(int xb,int yb,int xe,int ye );
    Mg_Solve(1,1,Length,Width);


    return 0;
}
 void  Mg_Solve(int xb,int yb,int xe,int ye )//从(xb,yb)到(xe,ye)
 {


     StType st;//定义栈
     st.top=-1;//栈顶指针初始化
     st.top++;//初始方块进栈
     st.data[st.top].i=xb;
     st.data[st.top].j=yb;
     st.data[st.top].di=-1;
     puzzle[xb][yb]=-1;
     while(st.top>-1)//栈不为空时循环
     {
          int i=st.data[st.top].i; int j=st.data[st.top].j;
          int di=st.data[st.top].di;//取栈顶方块
          if(i==xe&&j==ye)//找到了出口输出路径
          {
              cout<<"通过迷宫的路径如下"<<endl;
              for(int k=0;k<=st.top;k++)
              {
                cout<<"("<<st.data[k].i<<","<<st.data[k].j<<")";
                if((k+1)%4==0)
                {
                    cout<<endl;
                }


              }
              cout<<endl;
          }
          int find=0;
              while(di<4&&find==0)
              {
                  di++;
                  switch(di)
                  {
                      case 0:i=st.data[st.top].i-1;j=st.data[st.top].j;break;
                      case 1:i=st.data[st.top].i;j=st.data[st.top].j+1;break;
                      case 2:i=st.data[st.top].i+1;j=st.data[st.top].j;break;
                      case 3:i=st.data[st.top].i;j=st.data[st.top].j-1;break;
                  }
                  if(puzzle[i][j]==0)
                  {
                      find=1;
                  }
              }
              if(find==1)
              {
                  st.data[st.top].di=di;
                  st.top++;
                  st.data[st.top].i=i;
                  st.data[st.top].j=j;
                  st.data[st.top].di=-1;
                  puzzle[i][j]=-1;
              }
              else
              {
                  puzzle[st.data[st.top].i][st.data[st.top].j]=0;
                  st.top--;
              }


     }
     cout<<"已经全部搜索可行路径"<<endl;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值