生活随笔
收集整理的這篇文章主要介紹了
迷宫问题代码详解
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
迷宮問(wèn)題是回溯法的典型應(yīng)用,可以用棧解決,也可以用隊(duì)列來(lái)解決迷宮問(wèn)題。
下面是小編用棧解決迷宮問(wèn)題的已經(jīng)成功運(yùn)行的代碼,提供給大家參考。
#include<iostream>
#include<stdlib.h>
using namespace std;
#define MaxSize 100
typedef struct Box
{ int i; //當(dāng)前方塊的行號(hào)int j; //當(dāng)前方塊的列號(hào)int di; //di是下一可走相鄰方位的方位號(hào)
}Box;typedef struct Box T; //定義方塊類型
typedef struct mystack
{ T* data;int top; //棧頂指針
}mystack; //定義順序棧類型//構(gòu)造一個(gè)空的順序棧
void InitStack(mystack &s)
{ s.data = new T[MaxSize];s.top=-1;
}//順序棧的銷毀
void DestroyStack(mystack &s)
{delete []s.data; s.top=-1;
}
//判斷是否棧滿
bool fullstack(mystack &s)
{
if(s.top==MaxSize-1)return true;return false;
}//入棧操作
void Push(mystack &s,T &n)
{if(fullstack(s)){cout<<"full!"<<endl; }else{s.top++;s.data[s.top].i=n.i;s.data[s.top].j=n.j; //不能直接賦值,s.data[s.top]=n; ???不明白 }
}
//判斷是否棧空
bool StackEmpty(mystack &s)
{if(s.top==-1)return true;return false;
} //返回順序棧的長(zhǎng)度
int LengthStack(mystack &s)
{return s.top+1;
} //出棧操作
T Pop(mystack &s)
{Box m;if(s.top==-1) {cout<<"出棧失敗:下溢"<<endl; }else{m.i=s.data[s.top].i;m.j=s.data[s.top].j;m.di=s.data[s.top].di;s.top--;}return m;
} //取棧頂元素
T GetTop(mystack &s,Box &t)
{if(StackEmpty(s)){cout<<"棧頂元素已空" <<endl; } t=s.data[s.top];return t;
} bool mgpath(int xi,int yi,int xe,int ye,int mg[10][10]) //求解路徑為:(xi,yi)->(xe,ye)
{ T path[MaxSize],e; // 存儲(chǔ)入棧的Box值 int i,j,di,i1,j1,k,t=0; bool find;mystack st; //定義棧stInitStack(st); //初始化棧頂指針e.i=xi; e.j=yi; e.di=-1; //設(shè)置e為入口int p;//首元素入棧 Push(st,e); //方塊e進(jìn)棧//st.top++;mg[xi][yi]=-1; //入口的迷宮值置為-1避免重復(fù)走到該方塊while (!StackEmpty(st)) //棧不空時(shí)循環(huán){ GetTop(st,e); //取棧頂方塊ei=e.i; j=e.j; di=e.di;if (i==xe && j==ye) //找到了出口,輸出該路徑 { cout<<"一條迷宮路徑如下:"<<endl;k=0;while (!StackEmpty(st)){ e=Pop(st); //出棧方塊epath[k++]=e; //將e添加到path數(shù)組中}while (k>=1){ k--; cout<<"("<<path[k].i<<","<<path[k].j<<")"<<" ";cout<<endl;}cout<<endl;DestroyStack(st);//銷毀棧return true; //輸出一條迷宮路徑后返回true}find=false;di=-1;while (di<4 &&find==false ) //找相鄰可走方塊(i1,j1) { di++;switch(di){//按順時(shí)針旋轉(zhuǎn) case 0:i1=i-1; j1=j; break;//上 case 1:i1=i; j1=j+1; break;//右 case 2:i1=i+1; j1=j; break;//下 case 3:i1=i; j1=j-1; break;//左 }if(mg[i1][j1]==0) {find=true;break;} //找到一個(gè)相鄰可走方塊,設(shè)置find為真 }if (find==true) //找到了一個(gè)相鄰可走方塊(i1,j1){ //修改原棧頂元素的di值,記錄新的棧頂元素位于那個(gè)方位 e.di=di;e.i=i1; e.j=j1;
// cout<<"元素進(jìn)棧:"<<e.i<<" "<<e.j<<endl;Push(st,e); //相鄰可走方塊e進(jìn)棧mg[i1][j1]=-1; //(i1,j1)迷宮值置為-1避免重復(fù)走到該方塊}else //沒(méi)有路徑可走,則退棧{ e=Pop(st); //將棧頂方塊退棧
// cout<<"退棧元素為:"<<e.i<<"-"<<e.j<<endl; //讓退棧方塊的位置變?yōu)槠渌窂娇勺叻綁K}}DestroyStack(st); //銷毀棧return false; //表示沒(méi)有可走路徑
}int main()
{ int a[10][10];for(int i=0;i<10;i++)for(int j=0;j<10;j++) cin>>a[i][j];if(!mgpath(1,2,7,8,a))cout<<"該迷宮問(wèn)題沒(méi)有解!"<<endl;return 0;
}
輸入和運(yùn)行結(jié)果如下:
總結(jié)
以上是生活随笔為你收集整理的迷宫问题代码详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。