詳解迷宮最短路問題

2021-10-24 05:12:31 字數 1912 閱讀 4720

給定乙個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 行,每行...