迷宮的最短路徑問題,分別用DFS和BFS做

2021-08-19 22:47:33 字數 2882 閱讀 1044

迷宮的最短路徑一般來說用bfs做,但是也可以用dfs做,如果最優路徑只有一條的話,窮盡所有的路徑然後找出路徑最短的就好了。

不廢話,先上bfs**,這個**中,用到了每乙個位置的前驅節點,需要記住。然後逆著路徑列印出來。

#include#include#includeusing namespace std;

typedef pairpii;

void bfs(int a[10][10], int m, int n,int i, int j, pii pre[10][10])

); }

while (!q.empty())

); if (tmp.first + 1 == m - 1 && tmp.second == n - 1)

break;

} if (tmp.second + 1 < n && a[tmp.first][tmp.second + 1] == 0)

);if (tmp.first == m - 1 && tmp.second + 1 == n - 1)

break;

} if (tmp.first - 1 >= 0 && a[tmp.first - 1][tmp.second] == 0)

);if (tmp.first - 1 == m - 1 && tmp.second == n - 1)

break;

} if (tmp.second - 1 >= 0 && a[tmp.first][tmp.second - 1] == 0)

);if (tmp.first == m - 1 && tmp.second - 1 == n - 1)

break;

} a[tmp.first][tmp.second] = 1; }}

void print(pii res[100], pii pre[10][10],int m,int n,int i,int j)

// 順序輸出結果

while (count >= 0)

}int main()

pii res[100];

pii pre[10][10] ;

for (int i = 0; i < m; i++)

bfs(a, m, n, 0,0, pre);

print(res, pre, m, n, 0,0);

/*for (int i = 0; i < m; i++)

*/} return 0;

}

下面寫兩種dfs的**:

方法1:樸素的dfs

#include#includeusing namespace std;

typedef pairpii;

void dfs(int &min_t, int a[10][10], int m, int n, int i, int j, vectortmp, vector> visited, vector> &res)

dfs(min_t,a, m, n, i + 1, j, tmp, visited, res);

dfs(min_t,a, m, n, i - 1, j, tmp, visited, res);

dfs(min_t,a, m, n, i, j + 1, tmp, visited, res);

dfs(min_t,a, m, n, i, j - 1, tmp, visited, res);

}int main()

}vectorres;

vector> visited(m, vector(n, false));

vector> ret;

int min_t = 101;

dfs(min_t ,a, m, n, 0, 0, res, visited, ret);

for (int i = 0; i < ret.size(); i++)}}

}system("pause");

return 0;

}

方法2:

#include#includeusing namespace std;

int n, m; //分別代表行和列

vector> maze;//迷宮矩陣

vector> path_temp;//儲存當前路徑,第一維表示位置

vector> path_best;//儲存最佳路徑

void mazetrack(int i, int j)

);//將當前節點加入到路徑中

if (i == n - 1 && j == m - 1) //判斷是否到達終點

if (path_best.empty() || path_temp.size() < path_best.size())

path_best = path_temp;

if (i - 1 >= 0 && maze[i - 1][j] == 0)//探索向上走是否可行

mazetrack(i - 1, j);

if (i + 1 < n && maze[i + 1][j] == 0)//探索向下走是否可行

mazetrack(i + 1, j);

if (j - 1 >= 0 && maze[i][j - 1] == 0)//探索向左走是否可行

mazetrack(i, j - 1);

if (j + 1 < m && maze[i][j + 1] == 0)//探索向右走是否可行

mazetrack(i, j + 1);

maze[i][j] = 0; //恢復現場,設為未走

path_temp.pop_back();

}int main()

return 0;

}

迷宮最短路徑問題

問題描述 給定乙個迷宮和乙個起點乙個終點,求起點到終點的最短路徑長度。sample input 說明 5行5列的迷宮,為牆,為路,起點為 0,3 終點為 4,4 sample output 若不可達輸出 1 解答 用bfs的方法,借助乙個佇列實現。1 include2 include3 includ...

迷宮問題 最短路徑問題

給定乙個 n nn n 的二維陣列,如下所示 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。資料保證至少存在一條從左上角走到右下角的路徑。輸入格式 第一行包含整數 n。接下來 nn 行,每行...

迷宮最短路徑

include include using namespace std const int max n 100,max m 100 const int inf 100000000 使用pair表示狀態時,使用typedef會更加方便一些 typedef pairp 輸入 char maze max ...