日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

迷宫问题代码详解

發(fā)布時(shí)間:2024/1/1 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 迷宫问题代码详解 小編覺(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ò),歡迎將生活随笔推薦給好友。