題目描述:
有兩個無刻度標誌的水壺,分別可裝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...