迷宮問題 最短路徑問題

2021-10-14 16:21:29 字數 1718 閱讀 7953

給定乙個 n×nn×n 的二維陣列,如下所示:

int maze[5][5] = ;
它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。

資料保證至少存在一條從左上角走到右下角的路徑。

輸入格式

第一行包含整數 n。

接下來 nn 行,每行包含 nn 個整數 0 或 1,表示迷宮。

輸出格式

輸出從左上角到右下角的最短路線,如果答案不唯一,輸出任意一條路徑均可。

按順序,每行輸出乙個路徑中經過的單元格的座標,左上角座標為 (0,0)(0,0),右下角座標為 (n−1,n−1)(n−1,n−1)。

資料範圍

0≤n≤10000≤n≤1000

輸入樣例:

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

輸出樣例:
0 0

1 02 0

2 12 2

2 32 4

3 44 4

一般測試最短路勁問題有bfs+佇列來進行求解。

bfs+佇列的好處:能夠保證第一次到達目的地的時候就是最短的路徑。

佇列裡面的數你可以進行分塊來理解,比如 i ~ j 這個區間裡面的到起點的距離是一樣的為x,而 h ~ i-1這個區間裡面的數表示到起點的距離是一樣的為x-1。以此來看:

01   02

03 04

01可以從03和02到達,當把03,02乙個乙個壓進佇列的時候再取出來到01的距離是一樣的,此時無論是從誰到01都無所謂。

假如04到03這裡有乙個牆的話(不想畫了),那麼經過03到01的距離比經過02到01的距離肯定是要多的,所以佇列中02必在03前面。因此佇列保證了最短路徑的問題,而不用去儲存某次遍歷的全部路徑然後選擇最短的一條

#include

#include

#include

#include

using

namespace std;

typedef pair<

int,

int> pii;

queue q;

const

int n =

1010

;int a[n]

[n];

pii pre[n]

[n];

//pre[i][j]=:代表是從x,y這個點到達i,j這個點的

int dx=

;//左,上,右,下

int dy=

;int n;

void

bfs(

int x,

int y));

memset

(pre,-1

,sizeof pre)

;while

(q.size()

)); pre[tx]

[ty]

= node;}}

}int

main()

}bfs

(n-1

,n-1);

pii end =

;while

(true

)return0;

}

迷宮最短路徑問題

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

迷宮最短路徑問題 bfs

問題 求起點到終點的最小步數 分析 廣搜按照距開始狀態由近及遠的順序進行搜尋,因此很容易地來求最短路徑 最小操作之類問題的答案。include include include includeusing namespace std const int inf 10000000 typedef pair...

Maze A 迷宮最短路徑問題

東東有一張地圖,想通過地圖找到妹紙。地圖顯示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹紙,這兩個位置保證為0。請根據輸入的5x5二維陣列,僅由0和1組成,請輸出最短路徑.本題著重使用的是bfs,需要發掘的是每乙個點的鄰接點都有四個,思考如何訪問這些點,這是本題的乙個關鍵點.此題的另乙個...