栈的应用_DFS解迷宫问题
生活随笔
收集整理的這篇文章主要介紹了
栈的应用_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表示為:當前點的位置坐標+偏移量
完整代碼:
#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解迷宫问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 香港买保险的利弊
- 下一篇: 浦发信用卡分期手续费是多少