1. 程式人生 > >深度優先搜尋筆記2-機器人路徑規劃

深度優先搜尋筆記2-機器人路徑規劃

以下程式碼改編自《啊哈,演算法》,原始碼只輸出了路徑的步數,改編後可以輸出所有可行路徑與最最短路徑。

問題:

已知地圖map,給定起點和目標點,要求輸出從起點到目標點的所有路徑,並計算最短的路徑

程式碼:

/*
已知地圖map,給定起點和目標點,要求輸出從起點到目標點的所有路徑,並計算最短的路徑
*/

#include<iostream>
#include<vector>
using namespace std;

typedef struct Map
{
    int row;
    int col;
    vector<vector<int
>
>
map; vector<vector<int>> book; }; typedef struct Position { int x; int y; }; typedef vector<Position> Route; void dfs(Map& map, Position& curPos,Position&tarPos,vector<Route>& routes) { static Route route;//儲存當前路徑使用 int tx, ty; int
next[4][2] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };//一個點的上下左右 if (curPos.x == tarPos.x&&curPos.y == tarPos.y)//判斷是否到達目標點 { routes.push_back(route);//將當前路徑儲存到路徑表中 return;//返回 } for (int i = 0; i < 4; i++)//依次遍歷當前點的右邊、下邊、左邊、上邊(順時針方向) { tx = curPos.x + next[i][0
]; ty = curPos.y + next[i][1]; if (tx<0 || tx >= map.row ||ty<0 || ty >= map.col)//檢查邊界條件 { continue; } //檢視此點是否是障礙物以及是否被標記 if (map.map[tx][ty] == 0 && map.book[tx][ty] == 0) { map.book[tx][ty] = 1;//標記該點已經走過 curPos.x = tx;//更新當前點座標 curPos.y = ty; route.push_back(curPos);//存入路徑中 dfs(map, curPos, tarPos, routes);//以該點為起點進行下一輪的搜尋 map.book[curPos.x][curPos.y] = 0;//取消對該點的標記 route.pop_back();//彈出該點 if (route.size() > 0)//判斷是否是彈出的最後一個點 { curPos.x = route.back().x; curPos.y = route.back().y; } else//是最後一個點時,將當前點設定為起點 { curPos.x = 0; curPos.y = 0; } } } return; } int main() { Map map;//地圖 Position initPos, tarPos; vector<Route> routes;//儲存路徑 //定義地圖的行和列 map.row = 5; map.col = 4; //定義地圖 map.map = { {0,0,1,0}, {0,0,0,0}, {0,0,1,0}, {0,1,0,0}, {0,0,0,1}}; //初始化book,用於記錄該點是否已經走過 map.book = {{ 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }; //起點座標 initPos.x = 0; initPos.y = 0; //終點座標 tarPos.x = 4; tarPos.y = 2; //將起點標記為已經走過 map.book[initPos.x][initPos.y] = 1; //呼叫深度優先搜尋演算法計算可能的路徑 dfs(map, initPos, tarPos, routes); //輸出路徑 int minStep = 99999,index; for (int i = 0; i < routes.size(); i++) { if (minStep>routes[i].size()) { minStep = routes[i].size(); index = i; } cout << "Route " << i + 1 << ": "; for (int j = 0; j < routes[i].size(); j++) { cout << "[" << routes[i][j].x << "," << routes[i][j].y << "] "; } cout << endl; } cout << "最短路徑為:"; for (int i = 0; i < routes[index].size(); i++) { cout << "[" << routes[index][i].x << "," << routes[index][i].y << "] "; } cout << "\n最短路徑長度為:" << minStep << endl; system("pause"); return 0; }

輸出結果:

設定起點為(0,0),目標點為(4,2):
這裡寫圖片描述
參考文獻:《啊哈,演算法》–啊哈磊