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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

栈的应用_DFS解迷宫问题

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

深度優先搜索DFS求解迷宮問題

找到迷宮的可行路徑的坐標,這是一個搜索遍歷問題。

實現思路:

可行的路徑保存在路徑向量P中,從當前點尋找可行方向,如果可行則next入棧,不行則出棧退回前一點。

搜尋可行路徑的代碼:

while (!P.empty()){if (P.back().direction < d)//d是方向個數,表示可行{point next= { P.back().pt.x+delta[P.back().direction].x,P.back().pt.y + delta[P.back().direction].y };//下一個點++P.back().direction;if (maze[next.x][next.y] == unvisited)//未被訪問{maze[next.x][next.y] = visited;P.push_back({ next,0 });//放進路徑里if (next.x == destination.x&&next.y == destination.y)//到達終點break;}}elseP.pop_back();//,點無路可走時,出棧返回上一個點}

坐標軸:假定朝下為x軸正方向,朝右為y軸正方向

這里可以移動方向分為上下左右四種(d=4)情況,它們相對于當前點的方向偏移量如下:
右:{0,1}
下:{1,0}
左:{0,-1}
上:{-1,0}
構成方向向量:以下標取值0, 1, 2, 3標記右,下,左,上與當前點的偏移量.
point delta[d]={{0,1},{1,0},{0-1},{-1,0}};
舉例子:delta[0]表示向右走,delta[1]表示向下走。
下個點next表示為:當前點的位置坐標+偏移量

point next= { P.back().pt.x + delta[P.back().direction].x,P.back().pt.y + delta[P.back().direction].y };//下一個點

完整代碼:

#include"pch.h" #include <iostream> #include <vector>using namespace std;//點坐標 struct point {int x;int y; }; //狀態:點坐標+方向 struct status {point pt;int direction; // 以direction取值0, 1, 2, 3標記東南西北. };int main() {const int m = 5;const int n = 7;char maze[m][n] = { {'*','*','*','*','*', '*','*'},{'*','0','*', '0','0','0','*'},{'*','0','*', '0','*','0','*'},{'*','0','0', '0','*','0','*'},{'*','*','*', '*','*','*','*'}};const char visited = 'V';//訪問過的標記const char unvisited = '0';//未訪問過的標記//可行的方向數目0,1,2,3分別代表東南西北方向和當前位置的偏移量const int d = 4;const point delta[d] = { {0,1},{1,0},{0,-1},{-1,0}};//起點和終點坐標point source = { 1,1 };point destination = {3,5};vector<status> P;//搜索時保存路徑所用的向量,可視為棧;P.reserve(m*n);//提前預留容量;P.push_back({ source,0 });//設定初始位置,并設定初始方向;maze[source.x][source.y] = visited;//起點定為已經訪問while (!P.empty()){if (P.back().direction < d)//方向可取d是方向個數{point next= { P.back().pt.x+delta[P.back().direction].x,P.back().pt.y + delta[P.back().direction].y };//下一個點++P.back().direction;if (maze[next.x][next.y] == unvisited)//未被訪問{maze[next.x][next.y] = visited;P.push_back({ next,0 });//放進路徑里if (next.x == destination.x&&next.y == destination.y)//到達終點break;}}elseP.pop_back();//,點無路可走時,出棧返回上一個點}cout << "迷宮圖如下:" << endl; //print the mazefor (size_t i = 0; i < m; ++i)for (size_t j = 0; j < n; ++j){cout << maze[i][j];if (j == n - 1)cout << endl;} //打印路徑cout << "可行坐標路徑為:" << endl;for (const auto& c : P)cout << c.pt.x << " " << c.pt.y << endl;return 0; }

測試結果:

總結

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

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