c BFS模板題 水缸灌水 題解

2021-07-27 03:46:58 字數 1330 閱讀 8764

題目描述:

有兩個無刻度標誌的水壺,分別可裝x公升和

y公升(x,y為整數,x、

y<=100

)的水。設另一方面有一水缸,可用來向水壺灌水或倒出水,兩水壺間,水也可以相互傾灌。已知

x公升為滿壺,

y公升為空壺。問如何通過倒水或灌水操作用最少步數能在

y公升壺中量出z(

z<=100

)公升的水來。

輸入:一行:

x,y,z

輸出:每一行為乙個步驟,輸出步驟數和x、y水壺裡面的水(輸出時注意:本著節約用水的原則,因此,優先兩個水壺互相倒水,無法達到目的時,再考慮,將水浪費掉)

格式控制符為:sep%3d:%5d%5d

如果無解,則輸出:

no answer!

本題是一道bfs模板題,廣度搜尋的物件是當前狀態進行六種操

作後可能形成的八種狀態:

1.將x杯中的水倒入y杯中:(1)x杯空 (2)x杯有剩餘;

2.將y杯中的水倒入x杯中:(1)y杯空(2)y杯有剩餘;

因為要節約用水,因此以上兩種情況先寫。

3.將x杯中的水倒入水缸:x杯空;

4.將y杯中的水倒入水缸:y杯空;

5.將x杯灌滿:x杯滿;

6.將y杯灌滿:y杯滿;

為了記錄狀態,我們需要定義乙個結構體,用來記錄當前操作

步數,x杯中的水及其前驅(用來輸出),y杯中的水及其前

驅。另外需要乙個二維陣列用來判斷這步操作產生的狀態是否重

復,若沒有重複則操作進行。

#include#includestruct node;

int x,y,z;

int head=1,tail=1; //佇列

bool mark[110][110]; //用來判斷的二維陣列,mark[i][j]==1表示x杯中有i公升水,y杯中有j公升水

//的狀態出現過

node water[1110];

void bfs(node p)

else if(p.x+p.y>y&&mark[p.x+p.y-y][y]==0)

//y倒入x中

if(p.x+p.y<=x&&mark[p.y+p.x][0]==0)

else if(p.x+p.y>x&&mark[x][p.x+p.y-x]==0)

if(mark[x][p.y]==0)

if(mark[p.x][y]==0)

if(mark[0][p.y]==0)

if(mark[p.x][0]==0)

head++;//出隊

}void dg(int a,int b)

while(i



BFS模版題 水缸灌水(c )

先掛題目 水缸灌水 題目描述 有兩個無刻度標誌的水壺,分別可裝x公升和 y公升 x,y為整數,x y 100 的水。設另一方面有一水缸,可用來向水壺灌水或倒出水,兩水壺間,水也可以相互傾灌。已知 x公升為滿壺,y公升為空壺。問如何通過倒水或灌水操作用最少步數能在 y公升壺中量出z z 100 公升的...

分塊模板 模板題

嗯 直接貼板子了,注釋寫了點 include using namespace std const int maxn 1e5 10 int a maxn belong maxn l 1010 r 1010 block,num a陣列訪問原始資料,belong陣列表示每個數屬於哪一塊方便呼叫,l和r表示...

差距(模板題)

差距 difi 題目描述 給定乙個 n 個數的數列,再給出 q 個詢問 a b,詢問 a 到 b 之間最大值和最 小值的差。輸入檔案 第一行兩個整數 n,q。接下來一行 n 個整數表示 ai。接下來 q 行,表示乙個詢問 a b。輸出檔案 q 行,每行對應乙個詢問的答案。樣例輸入 5 4 7 2 4...