分紅酒
有4個紅酒瓶子,它們的容量分別是:9公升, 7公升, 4公升, 2公升
開始的狀態是 [9,0,0,0],也就是說:第乙個瓶子滿著,其它的都空著。
允許把酒從乙個瓶子倒入另乙個瓶子,但只能把乙個瓶子倒滿或把乙個瓶子倒空,不能有中間狀態。這樣的一次倒酒動作稱為1次操作。
假設瓶子的容量和初始狀態不變,對於給定的目標狀態,至少需要多少次操作才能實現?
本題就是要求你程式設計實現最小操作次數的計算。
輸入:最終狀態(逗號分隔)
輸出:最小操作次數(如無法實現,則輸出-1)
例如:輸入:
9,0,0,0
應該輸出:
0輸入:
6,0,0,3
應該輸出:
-1輸入:
7,2,0,0
應該輸出:
2
1 #include 2 #include 3 #include4using
namespace
std;56
int full[4] = ;
7 typedef struct
8state;
1213
int vis[10][8][5][3
];14
int bfs(state &temp , int i , int j)//
把i倒入j中
1524
else
2529
if(vis[temp.num[0]][temp.num[1]][temp.num[2]][temp.num[3]]) return
0;//
如果之前出現過這種情況,就不再反覆倒了
30 vis[temp.num[0]][temp.num[1]][temp.num[2]][temp.num[3]] = 1
;31 temp.step++;
32return1;
33}34int
main()
3552
if(end.num[0] + end.num[1] + end.num[2] + end.num[3] != 9)//
一共分的是9公升酒,輸入不合法
5357
while(!q.empty())
5867
inti , j;
68for(i = 0; i < 4; i++)//
把i倒入j中
6977}78
}79}80
}81return0;
82 }
分紅酒 藍橋杯 已更新
這是2013年藍橋杯全國軟體大賽模擬題的第4題,問題是分紅酒,方法是bfs。這是乙個關於廣度優先搜尋 bfs 的題目。每個杯中水的量只能為整數,所以狀態是有限的,遍歷這些狀態,並找出距離初始狀態最短的路徑,即為所求解。廣度優先搜尋 bfs 使用佇列實現,正如深度優先搜尋 dfs 使用堆疊實現。解題思...
藍橋杯入門訓練 藍橋杯備賽
begin 1 a b問題str1 input str2 str1.split s int str2 0 int str2 1 print s begin 2 序列求和s int input 用公式計算而不用迴圈,避免超時 n s s 1 2print int n begin 3 圓的面積impor...
藍橋杯 暗戀
問題描述 同在乙個高中,他卻不敢去找她,雖然在別人看來,那是再簡單不過的事。暗戀,是他唯一能做的事。他只能在每天課間操的時候,望望她的位置,看看她傾心的動作,就夠了。操場上的彩磚啊,你們的位置,就是他們能夠站立的地方,他倆的關係就像磚與磚之間一樣固定,無法動搖。還記得當初鋪磚的工人,將整個操場按正方...