題意:
給你兩個容器,容量分別為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...