迷宮-BFS
阿新 • • 發佈:2018-11-05
Description
定義一個二維陣列:
int maze[5][5] = {
0, 1, 0, 0, 0,
0, 1, 0, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
};
它表示一個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。
Input
一個5 × 5的二維陣列,表示一個迷宮。資料保證有唯一解。
Output
左上角到右下角的最短路徑,格式如樣例所示。
Sample Input
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
Sample Output
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
最簡單的求最短路徑問題,用BFS來解決,這裡需要注意的是結構體裡要定義一個字串變數用來儲存走過的路。
#include <queue> #include <string.h> #include <iostream> using namespace std; #define MAXN 10 //定義方向,頂部開始,順時針 int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; int a[MAXN][MAXN]; //作用:標記,走過的結點標記為1 int vis[MAXN][MAXN]; struct Node { int x; int y; string s; //字串s儲存走過的結點 }now, nextStep; //判斷結點能否通過 bool isPracticable(Node node) { //當超出邊界,或者已經被標記訪問過,或者遇到障礙物都不能再通過 if (node.x < 0 || node.x > 5 || node.y < 0 || node.y > 5 || vis[node.x][node.y] || a[node.x][node.y]) { return 0; } return 1; } void BFS() { queue<Node> Q; now.x = 0; now.y = 0; now.s = "00"; Q.push(now); vis[now.x][now.y] = 1; while (!Q.empty()) { //獲取佇列首部元素 now = Q.front(); if (now.x == 4 && now.y == 4) { //走到右下角,輸出結果 for (int i = 0; i < now.s.length(); i = i + 2) { cout << "(" << now.s[i] << ", " << now.s[i+1] << ")" << endl; } return; } for (int i = 0; i < 4; i++) { //按照上、右、下、左的方向搜尋,搜尋方向可隨意,但是要保證四個方向都被搜尋一遍 nextStep.x = now.x + dir[i][0]; nextStep.y = now.y + dir[i][1]; nextStep.s = now.s; if (isPracticable(nextStep)) { char x = nextStep.x + 48; char y = nextStep.y + 48; nextStep.s += x; nextStep.s += y; Q.push(nextStep); vis[nextStep.x][nextStep.y] = 1; } } //把對首元素排出佇列 Q.pop(); } } int main(int argc, const char * argv[]) { for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { cin >> a[i][j]; } } BFS(); return 0; }