程式設計Week2作業題B 倒水問題

2021-10-03 08:13:18 字數 2309 閱讀 7354

題意:

給你兩個容器,容量分別為a, b ,問是否能夠經過有限的步驟倒水, 得到容量為 c 的水。

輸入:

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

輸出:

你的程式的輸出將由一系列的指令組成。這些輸出行將導致某乙個罐子(不指定是哪乙個罐子)正好包含c單位的水。每組資料的最後一行輸出應該是「success」。輸出行從第1列開始,不應該有空行或任何尾隨空格。「fill a」 表示倒滿a杯,"empty a"表示倒空a杯,「pour a b」 表示把a的水倒到b杯並且把b杯倒滿或a倒空,以此類推。

輸入樣例:

2 7 5

2 7 4

輸出樣例:

fill b

pour b a

success

fill a

pour a b

fill a

pour a b

success

解題思路:

如果是上bfs演算法程式設計課之前,我大概只隱約記得離散數學上講過好像要用到狀態轉移方程的思想,似乎還與圖論有關。現在知道了這是一類叫做隱式圖問題的圖論問題,屬於bfs遍歷演算法的應用。題目中的每一種水的狀態都對對應於圖中的乙個點,題意就是從其實狀態所代表的點尋找路徑到最終狀態所表示的點,且每乙個點不要重複訪問(即不重複到達之前的狀態)。助教在課上也給出了自己的參考**,用結構體來書寫每個水杯的狀態status,建立的bfs使用的佇列也是status結構體型別的,對映mapmp用來表示某一狀態是否被訪問過,類似於vis二維陣列,對映mapfrom用來記錄每個狀態由來所經過的動作,例如:「pour a b」,便於後面輸出這些動作(即狀態轉移的過程)。對映mapfrom2用來記錄每乙個狀態的前繼狀態。遍歷過程和一般的bfs遍歷類似,只是每乙個點成為了每一種狀態。最後輸出依然可以選擇遞迴實現或利用vector(stack)。

注意事項:

1、map會對status結構體進行自動排序,故必須過載運算子』<』。

2、由於題目要求處理多種不同的情況,因此每次進入迴圈前要清空所要用到的資料結構。

總結:

這是屬於隱式圖問題,典型的bfs的應用,依然是抽象了bfs中的點的概念,這裡抽象成了乙個狀態(status),注意我們不希望回到已到達的乙個狀態,這個和bfs中已遍歷的點不希望再次遍歷的思想類似。然後就是輸出路徑了,遞迴輸出、vector、stack都行,推薦使用vector或stack。

參考**:

#include

using

namespace std;

int a, b, c;

struct status

status

(int _x,

int _y)

bool

operator

<

(const status &b)

const

status atob()

status btoa()

status filla()

status fillb()

status emptya()

status emptyb()

};mapbool

> mp;

map from;

map from2;

queue q;

void

print

(status t)

}void

bfs(

int a,

int b)

status x=t.

atob()

;if(mp[x]==0

) x=t.

btoa()

;if(mp[x]==0

) x=t.

filla()

;if(mp[x]==0

) x=t.

fillb()

;if(mp[x]==0

) x=t.

emptya()

;if(mp[x]==0

) x=t.

emptyb()

;if(mp[x]==0

)}}int

main()

return0;

}

程式設計思維與實踐 week2 作業題 倒水問題

倒水問題 fill a 表示倒滿a杯,empty a 表示倒空a杯,pour a b 表示把a的水倒到b杯並且把b杯倒滿或a倒空。輸入包含多組資料。每組資料輸入 a,b,c 資料範圍 0 a b c b 1000 a和b互質。你的程式的輸出將由一系列的指令組成。這些輸出行將導致任何乙個罐子正好包含c...

week2作業題 bfs迷宮問題 bfs倒水問題

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

程式設計Week2作業題A 迷宮問題

題意 左上角是迷宮入口,右下角是迷宮出口,尋找從入口到出口的最短路徑並輸出最短路徑。輸入 輸入是乙個5 5的二維陣列,僅由0 1兩數字組成,表示法陣地圖。輸出 輸出若干行,表示從左上角到右下角的最短路徑依次經過的座標,格式如樣例所示。資料保證有唯一解。輸入樣例 0 1 0 0 0 0 1 0 1 0...