迷宮的最短路徑

2021-10-03 13:25:17 字數 1692 閱讀 4476

挑戰程式設計競賽(第二版)

c/c++

迷宮的最短路徑

給定乙個大小為 n * m 的迷宮。迷宮由通道和牆壁組成,每一步可以向鄰接的上下左右四格的通道移動。請求出從起點到終點所需要的最小步數。請注意,本題假定從起點一定可以移動到終點。

輸入:n=10,m=10(迷宮如下所示。'#', '.', 's', 'g' 分別表示牆壁、通道、起點和終點)

# s # # # # # # .  #

.  # .  # # .  # # .  #

.  # .  .  .  .  .  .  .  .

# # .  # # .  # # # #

.  .  .  .  # .  .  .  .  #

.  # # # # # # # .  #

.  .  .  .  # .  .  .  .  .

.  # # # # .  # # # .

.  .  .  .  # .  .  . g #

輸出:

該題求最短路徑,一般求最短路徑、最少操作之類的題都應該想到寬度優先搜尋(bfs),因為寬度優先搜尋每次對當前結點所有可能達到的位置都遍歷一遍,很符合最少的思想。嘗試了一下寬度優先搜尋,發現果然可以,寬度優先搜尋的實現用到了佇列的思想。

設定乙個二維陣列表示距離,用來記錄每一步能到達的位置,用無窮大將陣列初始化,代表剛開始所有的位置都無法到達。開始時將起點距離設定為 0,進行寬度優先搜尋,最後檢查終點位置的數值,若為無窮大則不能到達,否則該值為起點到終點的最短距離。

#include #include #define max_n 100

#define max_m 100

using namespace std;

const int inf = 1000000; // 無窮大

// input

char maze[max_n][max_m] = ;

int m = 10, n = 10;

int sx = 0, sy = 1; // 起點座標

int gx = 9, gy = 8; // 終點座標

// input end

// code

struct point;

int d[max_n][max_m]; // 到各個位置的最短距離的陣列

int dx[4] = ; // 下、右、上、左

int dy[4] = ;

int bfs();

int main()

// 求從 到 的最短距離

// 如果無法到達,則是 inf

int bfs()

} // 把起點加入佇列,並把這一地點的距離設定為 0

point p;

p.x = sx;

p.y = sy;

que.push(p);

d[sx][sy] = 0;

// 不斷迴圈直到佇列長度為 0

while (que.size())

}

} return d[gx][gy];

}

最壞情況對整個 n * m 的陣列遍歷一次,因此時間複雜度為 o(n * m)。

寬度優先搜尋(bfs)

迷宮最短路徑

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

迷宮最短路徑

問題描述 小a同學現在被困在了乙個迷宮裡面,他很想從迷宮中走出來,他可以向上 向下 向左 向右移動 每移動一格都需要花費1秒的時間,不能夠走到邊界之外。假設小a現在的位置在s,迷宮的出口在e,迷宮可能有多個出口。問小a想要走到迷宮出口最少需要花費多少秒?並輸出從起點到最近出口的路徑。任務要求 1 迷...

迷宮的最短路徑

雖然在網上找不到題目,但這題實在是太經典了,好多搜尋題目都是從它變形來的 從s走到g,不能走 測試資料 10 10 s g include include includeusing namespace std const int inf 100000000 define max n 105 defi...