給定乙個 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,需要發掘的是每乙個點的鄰接點都有四個,思考如何訪問這些點,這是本題的乙個關鍵點.此題的另乙個...