初學 bfs 以及簡單習題練習

2021-10-25 20:27:55 字數 3817 閱讀 8425

題目二題目三

參加過一些ac的競賽了,一直搞不清楚bfs,資料結構方面對佇列的知識也大多了解,但是一直對bfs不怎麼感冒,這兩天看了很多文章終於有點懂了- -

1.定義地圖陣列mp以及其對應的visit陣列vis

2.定義結構體 存放座標以及步數資訊

3.定義移動陣列

5.bfs(起點、終點)

}return -1;遍歷完後依然沒到終點

}

這是乙個關於二維迷宮的題目。我們要從迷宮的起點 『s』 走到終點 『e』,每一步我們只能選擇上下左右四個方向中的乙個前進一格。 『w』 代表牆壁,是不能進入的位置,除了牆壁以外的地方都可以走。迷宮內的 『d』 代表一道上鎖的門,只有在持有鑰匙的時候才能進入。而 『k』 則代表了鑰匙,只要進入這一格,就會自動地拿到鑰匙。最後 『.』 則是代表空無一物的地方,歡迎自在的遊蕩。

本題的迷宮中,起點、終點、門跟鑰匙這四個特殊物件,每乙個恰好會出現一次。而且,此迷宮的四周 (最上面的一行、最下面的一行、最左邊的一列以及最右邊的一列) 都會是牆壁。

請問,從起點到終點,最少要走幾步呢?

輸入的第一行有兩個正整數h, w,分別代表迷宮的長跟寬。

接下來的h行代表迷宮,每行有乙個長度恰為w的字串,此字串只包含's','e','w','d ','k','.'這幾種字元。

請在一行中輸出乙個整數代表答案,如果無法從起點走到終點,請輸出-1。

輸入

4 12

wwwwwwwwwwww

we.w.s..w.kw

w..d..w....w

wwwwwwwwwwww

輸出

20輸入

6 6

wwwwww

wews.w

w.wk.w

w.wd.w

w.w..w

wwwwww

輸出

-1

#include.h>

using namespace std;

char mp[

500]

[500];

//注意地圖陣列不能叫map map是關鍵字c++會報錯

int vis[

500]

[500];

int h, w;

//長和寬 其實對應著行列

int dx=

;//右左下上

int dy=

;struct ren

st,ed,key,door;

//start end key鑰匙 door 門

int bfs

(ren beg, ren end)

}return-1

;}int main()

}//不走鑰匙

memset

(vis,0,

sizeof

(vis));

int ans1 =

bfs(st, ed)

;//找鑰匙

memset

(vis,0,

sizeof

(vis));

int ans2 =

bfs(st, key)

; mp[door.x]

[door.y]

='.'

;//鑰匙找門

memset

(vis,0,

sizeof

(vis));

int ans3 =

bfs(key, door)

;//men找出口

memset

(vis,0,

sizeof

(vis));

int ans4 =

bfs(door, ed);if

(ans1 ==-1

)//直接走不成功

else

}else

return0;

}

有乙個n ×m的棋盤(1一行四個資料,棋盤的大小和馬的座標

乙個n×m的矩陣,代表馬到達某個點最少要走幾步(左對齊,寬5格,不能到達則輸出-1)

輸入

3 3 1 1
輸出

0    3    2    

3 -1 1

2 1 4

老規矩,搞各種陣列,搞佇列,然後開始排列

#include.h>

using namespace std;

const int maxn =

500;

int m, n,sx,sy;

//地圖

//直往下和往右走

int stp[maxn]

[maxn]

;int dir[8]

[2]=

,,,,

,,,}

;//馬可以走的八個方向

struct pos

;bool judge

(int p, int q)

else

if(stp[p]

[q]!=-1

)else

return

true;}

void

bfs();

que.

push

(temp1)

;//jin dui

stp[sx]

[sy]=0

;while

(!que.

empty()

);//進隊

que.

push

(temp)

;//改進步數

stp[temp.x]

[temp.y]

= temp.step;

/* 下面注釋的這些也可以 替換42-52行即可

//走一步

if (judge(f.x+dir[i][0], f.y + dir[i][1]))

;//進隊

que.push(temp);

//改進步數

stp[temp.x][temp.y] = temp.step;

}*/}}

}int main()

cout << endl;

}}

二維矩陣,問從1,1位置到m,n位置有幾條線路

ps:矩陣下標為雙偶數的禁止路過,比如(2,2)、(4,4)等點

只能向右或者向下路行 .

兩個整數表示矩陣大小

乙個證書表示路線數量

輸入

3 4
輸出

2
*

*

#include.h>

using namespace std;

int m, n;

//地圖

//直往下和往右走

int dir[2]

[2]=

,};int ans =0;

struct pos

;void

bfs())

;//jin dui

while

(!que.

empty()

));}

}}int main()

寬度優化搜尋(BFS)簡單練習

廣度優先搜尋核心 廣度優先搜尋 param vs 起點 param vd 終點 bool bfs node vs,node vd if isvalid vw visit vw return false 無解 這道題就是bfs的基礎運用,只要是能通過斜著的橫著的豎著的連起來的就是乙個油田,按照這個思想...

mysql 簡單練習題

create table student id int,name varchar 20 chinese float,english float,math float insert into student id,name,chinese,english,math values 1,張小明 89,78...

python中的異常處理以及簡單練習題目

什麼是異常?異常是python物件,表示乙個錯誤。當python指令碼發生異常時我們需要捕獲處理它,否則程式會終止執行。在程式執行過程中,總會遇到各種各樣的錯誤,有的錯誤是程式編寫有問題造成的 還有一類錯誤是完全無法在程式執行過程中 的 一切異常皆是物件 系統定義的異常 baseexception ...