2020 程式設計思維week2關於BFS的問題

2021-10-03 11:59:54 字數 2885 閱讀 3713

問題描述:

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

input:

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

output:

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

樣例輸入:

0 1 0 0 0

0 1 0 1 0

0 1 0 1 0

0 0 0 1 0

0 1 0 1 0

樣例輸出:

(0, 0)

(1, 0)

(2, 0)

(3, 0)

(3, 1)

(3, 2)

(2, 2)

(1, 2)

(0, 2)

(0, 3)

(0, 4)

(1, 4)

(2, 4)

(3, 4)

(4, 4)

思考:

題目要求為最短路徑,最短路徑的我們常用的方法為kruskal,prim,bfs

從題目中分析該題採用bfs廣度優先搜尋是最常用的方法

設定起始位置和終點位置,每一次走有上下左右四種選擇,邊界判斷條件為位置x,y屬於0到4之間(包括邊界)

用-2來表示該格仔未訪問過,-1表示障礙物,起始點置為0,每次根據上乙個節點離初始點的距離記錄著乙個結點的距初始點的距離,並將前序節點儲存在pre陣列中,**如下:

void

bfs(

int sx,

int sy));

//初始點置為0

vis[sx]

[sy]=0

;while

(!a.

empty()

)if(newpair.x==

4&&newpair.y==4)

}}}}

最後為遞迴實現的輸出路徑的**:

pre陣列首先全初始化為-1,之後再將前序節點的x值乘10加上有y值儲存在陣列之中:

void

print

(int x,

int y)

if(x==

4&&y==4)

cout<<

"("<", "

<")"<}

**

問題描述:

倒水問題

「fill a」 表示倒滿a杯,"empty a"表示倒空a杯,「pour a b」 表示把a的水倒到b杯並且把b杯倒滿或a倒空。

input:

輸入包含多組資料。每組資料輸入 a, b, c 資料範圍 0 < a <= b 、c <= b <=1000 、a和b互質。

output:

你的程式的輸出將由一系列的指令組成。這些輸出行將導致任何乙個罐子正好包含c單位的水。每組資料的最後一行輸出應該是「success」。輸出行從第1列開始,不應該有空行或任何尾隨空格

****** input:

2 7 5

2 7 4

****** output:

fill b

pour b a

success

fill a

pour a b

fill a

pour a b

success

解題方法1:bfs廣度優先搜尋

思路:類似於上題思路,需要兩個矩陣記錄水量和路徑

因為題目給出的範圍我們將兩個矩陣的範圍設定成1005*1005

每一次操作有六種可能性:

倒滿a杯

倒滿b杯

倒空a杯

倒空b杯

b杯的水倒入a杯

a杯的水倒入b杯

我們在vis矩陣中記錄前乙個狀態到達這乙個狀態時需要進行的操作分別用1,2,3,4,5,6表示,沒有到達的位置用-1表示。

void

print

(int i)if(

!vis[a]

[t.b]

)//fill a if(

!vis[t.a]

[b])

//fill bif(

!vis[0]

[t.b]

)//drop aif(

!vis[t.a][0

])//drop bif(

!vis[

(a-t.a>=t.b)

?t.a+t.b:a]

[(a-t.a>=t.b)?0

:t.b-a+t.a]

)//pour b aif(

!vis[

(b-t.b>=t.a)?0

:t.a-b+t.b]

[(b-t.b>=t.a)

?t.a+t.b:b])}

return0;

}

方法二:

都題幹,我們發現ab兩個杯子的容量是互質的,那麼根據數學上的定理,

n*a/b的值在1到b-1之間迴圈,那麼根據c小於b這個前提條件,一定會有一種狀態使b中水為c

那麼我們模擬除法過程

a中倒滿水,倒入b中

此時有兩種情況第一種是b中還能到下a杯中的水,則倒入判斷b中水量

第二種則是,b中不能倒下a中的水,則a中的水倒滿b,b倒光,在將a中剩餘的水倒入b,判斷,反覆迴圈知道找到c

```cpp

void daoshui()

if(b == c)

} }

程式設計思維Week2 作業

輸入乙個5x5的二維陣列由0 1組成,表示法陣地圖。地圖顯示,0表示可以走,1表示不可以走,左上角是起點,右下角是終點,這兩個位置保證為0。編寫程式,找到起點到終點的最短路線。要求輸出若干行,表示從左上角到右下角的最短路徑依次經過的座標。資料保證有唯一解。該題是典型的bfs演算法應用。由於題目要求輸...

程式設計思維與實踐 Week2 作業

b題 倒水問題 bfs 東東有一張地圖,想通過地圖找到妹紙。地圖顯示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹紙,這兩個位置保證為0。既然已經知道了地圖,那麼東東找到妹紙就不難了,請你編乙個程式,寫出東東找到妹紙的最短路線。input 輸入是乙個5 5的二維陣列,僅由0 1兩數字組成,...

程式設計思維與實踐 Week2 作業

b pour water 東東有一張地圖,想通過地圖找到妹紙。地圖顯示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹紙,這兩個位置保證為0。既然已經知道了地圖,那麼東東找到妹紙就不難了,請你編乙個程式,寫出東東找到妹紙的最短路線。輸入 輸入是乙個5 5的二維陣列,僅由0 1兩數字組成,表示...