總結迷宮由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...