倒水問題 「fill a」 表示倒滿a杯,"empty a"表示倒空a杯,「pour a b」 表示把a的水倒到b杯並且把b杯倒滿或a倒空。
輸入包含多組資料。每組資料輸入 a, b, c 資料範圍 0 < a <= b 、c <= b <=1000 、a和b互質。output你的程式的輸出將由一系列的指令組成。這些輸出行將導致任何乙個罐子正好包含c單位的水。每組資料的最後一行輸出應該是「success」。輸出行從第1列開始,不應該有空行或任何尾隨空格。
2 7 5
2 7 4
putfill b
pour b a
success
fill a
pour a b
fill a
pour a b
success
如果你的輸出與sample output不同,那沒關係。對於某個"a b c"本題的答案是多解的,不能通過標準的文字對比來判定你程式的正確與否。 所以本題由 spj(special judge)程式來判定你寫的**是否正確。
此題為倒水問題,有a,b兩個杯子,要倒出容量為c的水,大方面來講有三種情況,即乙個杯子倒空,乙個杯子倒滿以及從乙個杯子倒入另乙個杯子中;而細分來講有八種情況,分別為:
(1)倒空a杯。
(2)倒空b杯。
(3)倒滿a杯。
(4)倒滿b杯。
(5)當a杯不滿且b杯有水的情況,b杯水倒入a杯:
(5.1)a.b水量不大於a杯容量時,倒入後b杯水為0,a杯為a+b的水量。
(5.2)a.b水量大於a杯容量時,倒入後b杯水為a+b的水量減去a的容量,a杯為a的容量。
(6)當b杯不滿且a杯有水的情況,a杯水倒入b杯:
(6.1)a.b水量不大於b杯容量時,倒入後a杯水為0,b杯為a+b的水量。
(6.2)a.b水量大於b杯容量時,倒入後a杯水為a+b的水量減去a的容量,b杯為b的容量。
要找出可行的方案,可以採用bfs寬度搜尋,亦可以採用dfs深度搜尋,此處採用bfs,因為bfs可以找到步驟最少的方案。
首先將每個狀態的a,b的水量用結構體node表示,其中node結構體中的status表示該a,b狀態是經過什麼操作形成的。然後定義乙個佇列,當佇列不為空時,取出隊首元素,根據前面分析的倒水的八種情況,將可能的a,b水量情況壓入佇列之中直到a,b中至少有乙個水量剛好等於目標水量c。最後遞迴輸出達到目標水量進行步驟的status即可。
#include
#include
#include
#include
#include
using
namespace std;
const
int maxn=
1e3+5;
struct node
bool
operator==(
const node &s)
const};
bool vis[maxn]
[maxn]
;node pre[maxn]
[maxn]
;void
trans
(node tt)
}void
output
(node tt)
}void
bfs(
int a,
int b,
int c)
if(s.b
//b中水不滿,倒滿b杯中的水 }if
(s.b>0)
//b中有水,倒空b杯中的水 }if
(s.a
//a中水不滿,倒滿a杯中的水 }if
(s.a>0)
//a中有水,倒空a杯中的水 }if
(s.a!=
0&&s.b
//a中有水且b中水不滿,考慮a杯倒入b杯
}else}}
if(s.b!=
0&&s.a
//a中有水且b中水不滿,考慮b杯倒入a杯
CODEVS 倒水問題
題目描述 有兩個無刻度標誌的水壺,分別可裝 x 公升和 y 公升 x,y 為整數且均不大於 100 的水。設另有一水 缸,可用來向水壺灌水或接從水壺中倒出的水,兩水壺間,水也可以相互傾倒。已知 x 公升壺為空 壺,y 公升壺為空壺。問如何通過倒水或灌水操作,用最少步數能在x或y公升的壺中量出 z z...
題解 倒水問題
實現 題目背景 輸入輸出已更改,請不要直接提交原先的 題目描述 假定兩個水壺a和b,供水量不限。可以使用三種方法裝水 給乙個水壺裝水 把乙個水壺倒空 從乙個水壺倒進另乙個水壺。當從乙個水壺倒進另乙個水壺時,如果第乙個水壺倒空,或者第二個水壺裝滿就不能再倒了。例如,乙個水壺a是5加侖和另乙個水壺b是6...
倒水問題 bfs
題目 倒水問題 fill a 表示倒滿a杯,empty a 表示倒空a杯,pour a b 表示把a的水倒到b杯並且把b杯倒滿或a倒空。輸入 輸入包含多組資料。每組資料輸入 a,b,c,資料範圍 0 a b c b 1000 a和b互質。輸出 你的程式的輸出將由一系列的指令組成。這些輸出行將導致任何...