解救小哈 廣度優先搜尋bfs

2021-09-16 12:19:28 字數 1771 閱讀 3528

有一天,小哈乙個去玩迷宮。但是方向感很不好的小哈很快就迷路了。小哼得知後便立即去解救無助的小哈。小哼當然是有備而來,已經弄清楚了迷宮地圖,現在小哼要以最快速度去解救小哈。問題就此開始了……

迷宮由n行m列的單元格組成,每個單元格要麼是空地,要麼是障礙物。你的任務是幫助小哼找到一條從迷宮的起點到小哈所在位置的最短路徑,注意障礙物是不能走的,當然也不能走到迷宮之外。n和m都小於等於100。

輸入格式:

第一行有兩個數n m。n表示迷宮的行,m表示迷宮的列。接來下來n行m列為迷宮,0表示空地,1表示障礙物。最後一行4個數,前兩個數為迷宮入口的x和y座標。後兩個為小哈的x和y座標。
輸出格式:

乙個整數表示小哼到小哈的最短步數。如果不能解救小哈則輸出no way!

rqnoj 34緊急援救

195校園迷宮

樣例 1 :

輸入:

5 40 0 1 0

0 0 0 0

0 0 1 0

0 1 0 0

0 0 0 1

1 1 4 3

輸出:

7

樣例 2 :

輸入:

3 31 1 1

0 1 0

0 1 0

2 1 3 3

輸出:

no way!

#include typedef struct notenote;

int main()

,book[101][101]=;//a存放,book標記已走過的點

int n,m,i,j,flag=0,x0,y0,endx,endy,tx,ty;

//x0,y0存放初始位置座標,,flag標記變數,endx,endy存放小哈位置座標

int next[4][2]=,,,};//有乙個二維陣列表示方向

int tail=1,head=1;//初始化佇列

scanf("%d%d",&n,&m);

for(i=1;i<=n;i++)

for(j=1;j<=m;j++)

scanf("%d",&a[i][j]);

scanf("%d%d%d%d",&x0,&y0,&endx,&endy);

//初始化

p[tail].x=x0;

p[tail].y=y0;

p[tail].f=0;

p[tail].s=0;

tail++;

book[x0][y0]=1;

while(headn||ty<1||ty>m)//判斷邊界

continue;

if(book[tx][ty]==0&&a[tx][ty]==0)//未走過,沒有障礙物則探索

if(tx==endx&&ty==endy)//如果到達目標點則標記並退出迴圈

}if(flag==1) break;

head++;//拓展佇列 }

if(flag==1)//判斷是否解救成功,並輸出資料

else

printf("no way!\n");

return 0;

}

測題**:

廣度優先搜尋 解救小哈(c )

廣度優先搜尋可以形象化為 淺嘗輒止 可以理解為雷達,訊號是一圈一圈的進行發射,即對於每乙個頂點我只訪問該頂點的臨近點,找出臨近點的的所有情況,並且用佇列儲存起來。include include using namespace std int a 51 51 int book 51 51 int si...

BFS廣度優先搜尋

廣度優先搜尋,利用佇列實現,結束標誌是隊列為空的時候 承接dfs的演算法實現的講例,對於迷宮問題我們也可以採取廣度優先搜尋實現 include iostream include cstdio include cstdlib using namespace std int map 55 55 int ...

bfs廣度優先搜尋

這一課我們來學習圖的另一種遍歷方法 廣度優先搜尋 breadth first search,簡稱 bfs 這是一種連通圖的常用遍歷策略,通常用於求起點到各點的最短路徑,以及求兩點之間的最優路徑等問題。首先我們先來看看廣度優先搜尋的具體方法吧 對於乙個連通圖,我們假設一開始所有頂點均未被訪問,廣度優先...