倒水問題 bfs

2021-10-03 11:37:02 字數 2800 閱讀 3057

題目:

倒水問題

「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。因為題目中需要輸出如何倒,那麼就需要儲存路徑。以前似...