5 5迷宮路徑問題

2021-10-03 09:09:39 字數 1868 閱讀 6324

東東有一張地圖,想通過地圖找到終點。地圖顯示,0表示可以走,1表示不可以走,左上角是入口,右下角是終點,這兩個位置保證為0。既然已經知道了地圖,那麼東東找到終點就不難了,請你編乙個程式,寫出東東找到終點的最短路線。

input:輸入是乙個5 × 5的二維陣列,僅由0、1兩數字組成,表示法陣地圖。

output:輸出若干行,表示從左上角到右下角的最短路徑依次經過的座標,格式如樣例所示。資料保證有唯一解。

首先看到這題目,已知是5*5的地圖,那麼就可以用乙個靜態陣列來儲存該地圖。並且在行走過程中要儲存點的座標,所以定義乙個結構體來表示這個座標,其中有橫座標x和縱座標y兩個成員。

並且對於這個問題來說,由於要找到最短路徑,則我們可以想到用廣度優先搜尋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...