1. 程式人生 > >迷宮-BFS

迷宮-BFS

迷宮問題
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
Submit Status

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;
}