迷宮問題 解救小哈

2021-10-10 05:40:32 字數 1936 閱讀 5179

總結迷宮由n行m列的單元格組成(n和m都<=50),每個單元格要麼是空地要麼是障礙物。小哼要以最快的速度解救小哈,幫助小哼找到一條從迷宮起點通往小哈所在位置的最短路徑。注:障礙物不能走,也不能走到迷宮之外。

首先我們可以用乙個二維陣列來儲存這個迷宮,剛開始的時候,小哼處於迷宮的入口處(1,1),小哈在(p,q)。就是找從(1,1)到(p,q)的最短路徑。小哼一開始在(1,1)他只能往右或者往下走。先讓小哼往右邊走,直到走不通了再回到這裡,然後再走另外乙個方向。規定按順時針嘗試(右,下,左,上)

我們先來看小哼一步之內到達的點有(1,2)和(2,1),先往右走走到(1,2),再往下走走到(2,2),因為仍然沒有找到小哈,所以得繼續走,直到無路可走或者找到小哈。但是需要注意,並不是找到小哈就結束了,因為這只是其中的乙個路徑,但不一定是最短的。現在我們嘗試用dfs深度搜尋來實現。dfs()處理的是當前應該怎麼辦。小哼面對的問題是,先檢查自己是不是在小哈的位置,如果沒有則找出下一步可以走的地方。我們設定3個引數,分別表示x的座標,y座標以及當前走過的步數step。

void

dfs(

int x,

int y,

int step)

判斷是否已經到達小哈的位置,只需要比較當前座標和小哈的座標是否相等即可

void

dfs(

int x,

int y,

int step)

return

;}

如果沒有找到小哈的位置,則找出下一步可以走的位置,因為有四個方向,按照之前的約定,右,下,左,上的順序。我們定義乙個方向陣列next

int next[4]

[2]=

,//向右走

,//向下走

,//向左走};

//向上走

通過這個方向陣列,使用迴圈很容易獲得下一步的座標。將下一步的橫座標用tx儲存,縱座標用ty儲存。

for

(k =

0; k <=

3; k++

)

再對(tx,ty)判斷是否越界,是否遇到障礙物,是否重複。用book[tx][ty]記錄格仔是否已經在路徑中

如果這個點符合所有的要求,就看下乙個點,此時用到遞迴dfs(tx,ty,step+1)

for

(k =

0; k <=

3; k++

)}

#include

int n, m, p, q, min =

99999999

;int a[51]

[21], book[51]

[51];

void

dfs(

int x,

int y,

int step)

,//向右走

,//向下走

,//向左走};

//向上走

int tx,ty,k;

//判斷是否到達小哈的位置

if(x == p && y == q)

//列舉四種走法

for(k =

0; k <=

3; k++)}

return;}

intmain()

輸入以下資料進行驗證。第一行代表迷宮的行和列;0和1代表空地和障礙物。最後一行代表入口x和y的座標,後兩個為小哈的x和y的座標

540

0100

0000

0100

1000

0011

143

7

我們仍然要明確dfs演算法是解決當前面臨的問題,找到當前需要解決的問題,就能寫出dfs函式。

解救小哈(深度搜尋)

本題可以用深度搜尋,也可以用廣度搜尋,相對來說,廣度搜尋更加簡潔,但是為了學習深度搜尋,故本題採用深度搜尋。思路 依然是使用遞迴,一步一步向前試探,試探後再回溯,最後比較結果,即可得出答案。如下 include define max n 100 define max m 100 inta max n...

解救小哈 BFS演算法舉例

有一天,小哈乙個人去玩迷宮。但是方向感不好的小哈很快就迷路了。小哼得知後便去解救無助的小哈。此時的小哼已經弄清楚了迷宮的地圖,現在小哼要以最快的速度去解救小哈。那麼,問題來了.輸入5 4 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1 4 3 輸出輸入 3 3...

啊哈演算法 bfs 解救小哈

include struct note 定義乙個結構體佇列 int main book 51 51 a陣列存地圖,book標記那個點走過 int next 4 2 定義的方向 int head,tail 標記頭和尾 int i,j,k,n,m,startx,starty,endx,endy,tx,t...