深度優先搜尋筆記2-機器人路徑規劃
阿新 • • 發佈:2019-01-02
以下程式碼改編自《啊哈,演算法》,原始碼只輸出了路徑的步數,改編後可以輸出所有可行路徑與最最短路徑。
問題:
已知地圖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):
參考文獻:《啊哈,演算法》–啊哈磊