給定乙個n*m的二維整數陣列,用來表示乙個迷宮,陣列中只包含0或1,其中0表示可以走的路,1表示不可通過的牆壁。
最初,有乙個人位於左上角(1, 1)處,已知該人每次可以向上、下、左、右任意乙個方向移動乙個位置。
請問,該人從左上角移動至右下角(n, m)處,至少需要移動多少次。
資料保證(1, 1)處和(n, m)處的數字為0,且一定至少存在一條通路。
輸入格式
第一行包含兩個整數n和m。
接下來n行,每行包含m個整數(0或1),表示完整的二維陣列迷宮。
輸出格式
輸出乙個整數,表示從左上角移動至右下角的最少移動次數。
資料範圍
1≤n,m≤100
輸入樣例:
5 50 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並且求最短路問題可用bfs。用乙個佇列來儲存當前符合條件的點,首先先取出佇列的第乙個元素,然後將這個位置向上下左右四個方向擴充套件,符合條件的點加入佇列當中
//求這種最少移動次數 ,並且邊的權值為1的情況下可以用bfs求最短路
#include
using
namespace std;
int n,m;
typedef pair<
int,
int> pii;
const
int n=
104;
int d[n]
[n],g[n]
[n];
pii q[n*n]
;//存放每個點的座標
intbfs()
;memset
(d,-1,
sizeof
(d))
;int dx[4]
=;int dy[4]
=;//最開始在第乙個位置 所以標價為0
d[0]
[0]=
0;while
(hh<=tt);}
}}return d[n-1]
[m-1];
}int
main()
} cout<<
bfs(
)
}
擴充套件:
將走過的位置輸出出來,只要用乙個佇列來儲存每個點的位置即可
//求這種最少移動次數 ,並且邊的權值為1的情況下可以用bfs求最短路
#include
using
namespace std;
int n,m;
typedef pair<
int,
int> pii;
const
int n=
104;
int d[n]
[n],g[n]
[n];
pii q[n*n]
;//存放每個點的座標
pii pre[n]
[n];
intbfs()
;memset
(d,-1,
sizeof
(d))
;int dx[4]
=;int dy[4]
=;//最開始在第乙個位置 所以標價為0
d[0]
[0]=
0;while
(hh<=tt);}
}}int x=n-
1,y=m-1;
while
(x||y)
return d[n-1]
[m-1];
}int
main()
} cout<<
bfs(
)
}
迷宮問題 最短路
一 題目 poj 3984 給出乙個只有0和1組成的5x5的矩陣表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。二 解題思路 迷宮問題中的最短路多用bfs,由於要輸出最短路,一般可以在更新時儲存前驅節點,這裡使用dfs從...
迷宮最短路徑問題
問題描述 給定乙個迷宮和乙個起點乙個終點,求起點到終點的最短路徑長度。sample input 說明 5行5列的迷宮,為牆,為路,起點為 0,3 終點為 4,4 sample output 若不可達輸出 1 解答 用bfs的方法,借助乙個佇列實現。1 include2 include3 includ...
迷宮問題 最短路徑問題
給定乙個 n nn n 的二維陣列,如下所示 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。資料保證至少存在一條從左上角走到右下角的路徑。輸入格式 第一行包含整數 n。接下來 nn 行,每行...