題目:
倒水問題
「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單位的水。每組資料的最後一行輸出應該是「success」。輸出行從第1列開始,不應該有空行或任何尾隨空格。
樣例輸入:
2 7 5
2 7 4
樣例輸出:
fill b
pour b a
success
fill a
pour a b
fill a
pour a b
success
最初看到這題的時候不能理解為什麼能用bfs來做,後來問了下別人才理解:
可以把最初兩個水杯的狀態看做(0,0)點,由於是2個杯子,有6種操作:1,a倒滿 2,b倒滿 3,a倒空 4,b倒空 5,a倒入b 6,b倒入a;兩個杯子從乙個狀態到另乙個狀態可以認為從乙個點到另乙個點,是依靠6種方法中的一種。如果最後能到達目標狀態所代表的的點,則說明是可以依靠這六種方法倒出目標狀態的水的。
設乙個全域性變數int table[1100][1100];
乙個初始化函式init,初始化table
void
init()
}}
函式pour,改變兩杯水的狀態
node pour
(int a,
int b,node now,
int way)
else
break
;case5:
if(a+b>b)
else
break;}
next.a=a;
next.b=b;
next.op=way;
return next;
}
然後是bfs的過程函式
init()
;//每一組資料都需要初始化一遍
int final=0;
//記錄最後一步時front的值
int front=
0,last=0;
node queue[
1100];
//佇列陣列
node now;
now.a=0;
now.b=0;
now.pre=-1
; now.op=0;
table[0]
[0]=
1;queue[0]
=now;
last++
;while
(front//用front和last表示隊首和隊尾
for(
int i=
0;i<
6;i++)}
front++
;}
為了輸出倒水的過程,需要利用每個節點的pre和op從佇列陣列中得到過程,這也是為什麼不用stl的佇列的原因。
node invert[
1100];
int j=final;
int count=0;
while
(j>=1)
//將中間步驟提取到invert中,然後倒序輸出
for(
int i=count-
1;i>=
0;i--)}
cout<<
"success"
<<
'\n'
;
下面是完整**:
#include
using
namespace std;
struct node
;int table[
1100][
1100];
node pour
(int a,
int b,node now,
int way)
else
break
;case5:
if(a+b>b)
else
break;}
next.a=a;
next.b=b;
next.op=way;
return next;
}void
init()
}}void
bfs(
int a,
int b,
int c)
for(
int i=
0;i<
6;i++)}
front++;}
node invert[
1100];
int j=final;
int count=0;
while
(j>=1)
//將中間步驟提取到invert中,然後倒序輸出
for(
int i=count-
1;i>=
0;i--)}
cout<<
"success"
<<
'\n';}
intmain()
}
倒水問題BFS
傳送門.題意兩個杯子容量為a,b,有6個操作 fill 1 裝滿a fill 2 裝滿b drop 1 倒掉a drop 2 倒掉b pour 1,2 a倒給b,到b滿為止 pour 2,1 b倒給a,到a滿為止 問最少多少次能有其中乙個杯子裡面有c公升水。輸出相應操作。bfs搜尋6種情況,煩是真的...
bfs求解倒水問題
倒水問題 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 你的程式的輸出將由一系列的指令組成。這些輸出行將導致任何...
poj 3414 倒水問題 bfs
思路 就是bfs,有六種操作,fill 1或2,drop 1或2 將1倒到2,將2倒到1。要注意的是要使用標記陣列vis i j 表示左邊的杯子為i公升,右邊的杯子為j公升,如果已被標記說明之前已經出現這種情況,就不要入隊。從 0,0 開始bfs。因為題目中需要輸出如何倒,那麼就需要儲存路徑。以前似...