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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

回溯法解迷宫问题

發布時間:2025/6/15 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 回溯法解迷宫问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? 迷宮問題中,在尋找路徑時,采用的方法通常是:從入口出發,沿某一方向向前試探,若能走通,則繼續向前進;如果走不通,則要沿原路返回,換一個方向再繼續試探,直到所有可能的能跟都試探完成為止。為了保證在任何位置上都能沿原路返回(回溯),要建立一個后進先出的棧來保存從入口到當前位置的路徑。

????? 而且在求解迷宮路徑中,所求得的路徑必須是簡單路徑。即在求得的路徑上不能有重復的同一塊通道。

????? 為了表示迷宮,設置一個數組,其中每個元素表示一個方塊的狀態,為0時表示對應方塊是通道,為1時表示對應方塊為墻,數組如下所示:

[cpp]?view plaincopy
  • int?mg[10][10]?=?{??????//定義一個迷宮,0表示通道,1表示墻??
  • ????{1,1,1,1,1,1,1,1,1,1},??
  • ????{1,0,0,1,1,0,0,1,0,1},??
  • ????{1,0,0,1,0,0,0,1,0,1},??
  • ????{1,0,0,0,0,1,1,0,0,1},??
  • ????{1,0,1,1,1,0,0,0,0,1},??
  • ????{1,0,0,0,1,0,0,0,0,1},??
  • ????{1,0,1,0,0,0,1,0,0,1},??
  • ????{1,0,1,1,1,0,1,1,0,1},??
  • ????{1,1,0,0,0,0,0,0,0,1},??
  • ????{1,1,1,1,1,1,1,1,1,1}};??
  • ????? 對于迷宮中每個方塊,都有上下左右四個方塊相鄰,第i行第j列的當前方塊的位置為(i,j),規定上方方塊為方位0,按順時針方向遞增編號。假設從方位0到方位3的方向查找下一個可走方塊。

    ????? 為便于回溯,對于可走的方塊都要進棧,并試探它的下一個可走方位,將這個可走的方位保存到棧中,棧定義如下:

    [cpp]?view plaincopy
  • struct?St????????????????//定義一個棧,保存路徑??
  • {??
  • ????int?i;???????????????//當前方塊的行號??
  • ????int?j;???????????????//當前廣場的列號??
  • ????int?di;??????????????//di是下一可走方位的方位號??
  • }?St[MaxSize];???????????//定義棧??
  • ????? 求解路徑過程為:先將入口進棧(初始方位設置為-1),在棧不為空時循環:取棧頂方塊(不退棧),若是出口,則輸出棧中方塊即為路徑。否則,找下一個可走的相鄰方塊,若不存在這樣的方塊,則退棧。若存在,即將其方位保存到棧頂元素中,并將這個可走相鄰方塊進棧(初始方位設置為-1)。

    ????? 為保證試探可走相鄰方塊不是已走路徑上的方塊,如(i,j)已經進棧,在試探(i+1,j)的下一可走方塊時,又試探到(i,j),這樣會引起死循環,為此,在一個方塊進棧后,將對應的mg數組元素值改為-1(變為不可走),當退棧時(沒有可走的相鄰方塊),將其恢復為0.

    ????? 算法如下:

    [cpp]?view plaincopy
  • #include?<iostream>????????
  • #include?<iomanip>????
  • #include?<stdlib.h>??
  • using?namespace?std;???
  • ??
  • ??
  • #define?MaxSize?100??
  • ??
  • int?mg[10][10]?=?{??????//定義一個迷宮,0表示通道,1表示墻??
  • ????{1,1,1,1,1,1,1,1,1,1},??
  • ????{1,0,0,1,1,0,0,1,0,1},??
  • ????{1,0,0,1,0,0,0,1,0,1},??
  • ????{1,0,0,0,0,1,1,0,0,1},??
  • ????{1,0,1,1,1,0,0,0,0,1},??
  • ????{1,0,0,0,1,0,0,0,0,1},??
  • ????{1,0,1,0,0,0,1,0,0,1},??
  • ????{1,0,1,1,1,0,1,1,0,1},??
  • ????{1,1,0,0,0,0,0,0,0,1},??
  • ????{1,1,1,1,1,1,1,1,1,1}};??
  • ??
  • struct?St????????????????//定義一個棧,保存路徑??
  • {??
  • ????int?i;???????????????//當前方塊的行號??
  • ????int?j;???????????????//當前廣場的列號??
  • ????int?di;??????????????//di是下一可走方位的方位號??
  • }?St[MaxSize];???????????//定義棧??
  • ??
  • int?top?=?-1;????????????//初始化棧指針??
  • ??
  • void?MgPath(int?xi,?int?yi,?int?xe,?int?ye)????????????//路徑為從(xi,yi)到(xe,ye)??
  • {??
  • ????int?i,?j,?di,?find,?k;??
  • ????top++;?????????????????????????????????????????????//初始方塊進棧??
  • ????St[top].i?=?xi;St[top].j?=?yi;St[top].di?=?-1;??
  • ????mg[xi][yi]?=?-1;??
  • ????while(top>-1)??????????????????????????????????????//棧不為空時循環??
  • ????{??
  • ????????i?=?St[top].i;j?=?St[top].j;di?=?St[top].di;??
  • ????????if(i==xe?&&?j==ye)?????????????????????????????//找到了出口,輸出路徑??
  • ????????{??
  • ????????????cout?<<?"迷宮路徑如下:/n";??
  • ????????????for(k=0;?k<=top;?k++)??
  • ????????????{??
  • ????????????????cout?<<?"/t("?<<?St[k].i?<<?","?<<?St[k].j?<<?")";??
  • ????????????????if((k+1)%5==0)?cout?<<?endl;????????????//每輸出五個方塊后換一行??
  • ????????????}??
  • ????????????cout?<<?endl;??
  • ????????????return;??
  • ????????}??
  • ????????find?=?0;??
  • ????????while(di<4?&&?find==0)??????????????????????????//找下一個可走方塊??
  • ????????{??
  • ????????????di++;??
  • ????????????switch(di)??
  • ????????????{??
  • ????????????case?0:i?=?St[top].i-1;?j?=?St[top].j;?break;??
  • ????????????case?1:i?=?St[top].i;?j?=?St[top].j+1;?break;??
  • ????????????case?2:i?=?St[top].i+1;?j?=?St[top].j;?break;??
  • ????????????case?3:i?=?St[top].i;?j?=?St[top].j-1;?break;??
  • ????????????}??
  • ????????????if(mg[i][j]==0)?find?=?1;??????????????????????//找到通路??
  • ????????}??
  • ????????if(find==1)????????????????????????????????????????//找到了下一個可走方塊??
  • ????????{??
  • ????????????St[top].di?=?di;???????????????????????????????//修改原棧頂元素的di值??
  • ????????????top++;?????????????????????????????????????????//下一個可走方塊進棧??
  • ????????????St[top].i?=?i;?St[top].j?=?j;?St[top].di?=?-1;??
  • ????????????mg[i][j]?=?-1;?????????????????????????????????//避免重復走到這個方塊??
  • ????????}??
  • ????????else???????????????????????????????????????????????//沒有路可走,則退棧??
  • ????????{??
  • ????????????mg[St[top].i][St[top].j]?=?0;??????????????????//讓該位置變成其它路徑可走方塊??
  • ????????????top--;??
  • ????????}??
  • ????}??
  • ????cout?<<?"沒有可走路徑!/n";??
  • }??
  • ??
  • int?main()??
  • {??
  • ????MgPath(1,1,8,8);??
  • }??
  • 總結

    以上是生活随笔為你收集整理的回溯法解迷宫问题的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 九草av| 国产亚洲性欧美日韩在线观看软件 | 97青青草 | 亚洲精品一区三区三区在线观看 | 在线高清av| 精品一区二区三区日韩 | 国产精品极品 | 少妇视频一区二区三区 | 99热综合 | 九九精品在线观看视频 | 蜜桃传媒一区二区亚洲 | 97久久久久久 | 久久九九国产 | 国产一区二区久久 | 亚洲婷婷小说 | 久久久国产一区二区 | 国产成人精品白浆久久69 | 亚洲视频图片小说 | 高清不卡一区 | 69网址 | 姐姐的朋友2在线 | 国产成人免费在线观看 | 波多野结衣视频观看 | 亚洲欧美成人一区二区 | 隔壁人妻偷人bd中字 | 91网页入口 | 九九精品视频免费 | 狠狠久久综合 | 亚洲欧美在线观看 | 国产视频一二区 | 亚洲精品www久久久久久 | 国产欧美日韩免费 | 激情爱爱网站 | 久久九九综合 | 精品毛片 | 成人一二三区 | 亚洲av综合永久无码精品天堂 | 91成人在线观看喷潮动漫 | 成人在线直播 | 欧美一级黄色片视频 | 伊伊综合网 | 日韩精品无码一区二区 | 少妇综合 | 26uuu欧美日本 | 91插插插视频 | www.五月婷婷.com| 久久精国产 | 国产一级在线免费观看 | 成人一区二区三区在线观看 | 麻豆一区二区在线 | 国产自偷自拍 | 自拍视频在线 | 高潮一区二区三区乱码 | 色哟哟导航 | 人妻丰满熟妇av无码久久洗澡 | 操干视频 | jizzjizz日本免费视频 | 日韩视频福利 | 欧美激情一区二区三区p站 欧美mv日韩mv国产网站app | 人人爽在线 | 日韩草逼视频 | 午夜精品国产精品大乳美女 | 日本公与丰满熄 | 亚洲第一视频网 | 国产91影院 | 希岛婚前侵犯中文字幕在线 | 日韩国产精品久久 | 亚洲综合首页 | 少妇一级淫片免费观看 | 欧美精品一区二区三区在线播放 | 日韩欧美在线精品 | 中文字幕15页 | 免费无码肉片在线观看 | 色偷偷欧美 | 日本伦理在线 | 一区二区三区国产在线观看 | 天天射综合 | 黄色1级片 | 极品美女无套呻吟啪啪 | 美女脱了内裤喂我喝尿视频 | 青青操视频在线 | 国产素人自拍 | 日韩精品久久一区二区 | 91福利在线观看视频 | 午夜精品久久久久久久久久蜜桃 | 中文字幕在线看高清电影 | 亚洲一区二区三区人妻 | 风流少妇 | 国产精品美女毛片真酒店 | 久久99色| 国产乱国产乱老熟 | 久草大| 不良视频在线观看 | 6680新视觉电影免费观看 | 中文毛片无遮挡高潮免费 | 国产偷人妻精品一区 | 欧美精品一区二区三区在线 | 久本草精品| 亚洲免费综合 |