東東有一張地圖,想通過地圖找到終點。地圖顯示,0表示可以走,1表示不可以走,左上角是入口,右下角是終點,這兩個位置保證為0。既然已經知道了地圖,那麼東東找到終點就不難了,請你編乙個程式,寫出東東找到終點的最短路線。
input:輸入是乙個5 × 5的二維陣列,僅由0、1兩數字組成,表示法陣地圖。首先看到這題目,已知是5*5的地圖,那麼就可以用乙個靜態陣列來儲存該地圖。並且在行走過程中要儲存點的座標,所以定義乙個結構體來表示這個座標,其中有橫座標x和縱座標y兩個成員。output:輸出若干行,表示從左上角到右下角的最短路徑依次經過的座標,格式如樣例所示。資料保證有唯一解。
並且對於這個問題來說,由於要找到最短路徑,則我們可以想到用廣度優先搜尋bfs,因為bfs是一層一層的遍歷,所以得到的路徑肯定是最短的。在bfs過程中,我們要考慮乙個點有沒有走過,則我們用乙個vis二維陣列來進行標記,一開始初始化為0,如果走到該點則進行標記,將vis陣列的值賦為1。在該迷宮中。每一次bfs要考慮四個方向,上下左右依次去訪問,這四個方向可以表示在座標的變換上,則我們定義兩個陣列,來表示x和y座標的變化。由於要儲存座標,則用乙個結構體型別的陣列from來儲存該座標的上乙個位置,這樣我們我們有乙個位置就能找到其上乙個位置,以便於最後輸出。
在每一次bfs中,我們都要特判終點,如果x和y座標都為5,則退出。如果不是,在進行座標變換時,都必須保證座標在迷宮內,並且沒有障礙物和標記,這樣才能將其壓入佇列。在將其壓入佇列時,記錄該點from陣列的值,並將vis陣列的值標記為1。
在輸出時,定義乙個vector陣列,從終點開始,依據from陣列的值,不斷尋找其上乙個元素,並將其插入vector陣列末尾,知道起點位置,然後將vector陣列進行倒敘輸出。
在這個題目當中,想到用bfs是該題目的突破口,並且怎樣在bfs過程中保留路徑是乙個難題,通過乙個陣列,陣列的下標就是該座標,其值為其上乙個可到達的點,這樣就可以不斷呼叫該陣列,進行結果輸出。
#include
#include
using
namespace std;
struct local
;int a[6]
[6];
//迷宮陣列
int vis[6]
[6];
//該點是否可到達
int move_x=
;int move_y=
;local from[6]
[6];
//儲存上乙個位置
intmain()
//輸入迷宮
for(
int i=
1;i<=
5;i++
) queue store;
vis[1]
[1]=
1;//將起點標記
local ll;
from[1]
[1]=ll;
ll.x=1;
ll.y=1;
store.
push
(ll)
; vis[1]
[1]=
1;while
(!store.
empty()
)}} vector p;
//路線保留在陣列中
int n_x=
5,n_y=5;
while
((n_x!=1)
||(n_y!=1)
) p.
push_back
(ll)
;for
(int i=p.
size()
-1;i>=
0;i--
)//倒序輸出
}
迷宮問題 最短路徑問題
給定乙個 n nn n 的二維陣列,如下所示 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。資料保證至少存在一條從左上角走到右下角的路徑。輸入格式 第一行包含整數 n。接下來 nn 行,每行...
迷宮問題(輸出路徑)
迷宮問題 time limit 1000 ms memory limit 65536 kb 64bit io format i64d i64u description 定義乙個二維陣列 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求...
迷宮最短路徑問題
問題描述 給定乙個迷宮和乙個起點乙個終點,求起點到終點的最短路徑長度。sample input 說明 5行5列的迷宮,為牆,為路,起點為 0,3 終點為 4,4 sample output 若不可達輸出 1 解答 用bfs的方法,借助乙個佇列實現。1 include2 include3 includ...