先掛題目:
水缸灌水
題目描述
有兩個無刻度標誌的水壺,分別可裝x公升和
y公升(x,y為整數,x、
y<=100
)的水。設另一方面有一水缸,可用來向水壺灌水或倒出水,兩水壺間,水也可以相互傾灌。已知
x公升為滿壺,
y公升為空壺。問如何通過倒水或灌水操作用最少步數能在
y公升壺中量出z(
z<=100
)公升的水來。
輸入
一行:x,y,z
輸出
每一行為乙個步驟,輸出步驟數和x、
y水壺裡面的水(輸出時注意:本著節約用水的原則,因此,優先兩個水壺互相倒水,無法達到目的時,再考慮,將水浪費掉)
格式控制符為:
sep%3d:%5d%5d
如果無解則輸出
no answer!
樣例輸入
8 5 3
樣例輸出
sep0: 8 0
sep1: 3 5
sep2: 3 0
sep3: 0 3
這道題與一般的水缸灌水有一定區別,一般的水缸灌水只需要輸出需要的最小步數而這道題需要輸出每一步的水壺中的水量並且要節約用水(我做的時候被坑得要死)。
根據題意我們可以看出一共有六種情況: 1
、a壺倒空,2、
b壺倒空,3、
a壺倒滿,4、
b壺倒滿 5
、a壺倒入
b壺中(1)
b壺倒滿,
a壺沒有剩餘(2)
b壺倒滿,
a壺有剩餘 6
、b壺倒入a
壺中(1)a
壺倒滿,
b壺沒有剩餘(2)
a壺倒滿,
b壺有剩餘
通過這六種情況可以建立乙個函式,把這六步遍歷一遍即可。
**如下:
#include#includestruct cup;
int a,b,z,tail=2;
bool f[110][110],s[110][110];
cup q[1010];
void water(cup in)
}else
}p=in;
if(in.x+in.y<=a)
}
else
}p=in;
p.x=0; //a桶倒空
if(s[p.x][p.y]==0)
p=in;
p.y=0; //b桶倒空
if(s[p.x][p.y]==0)
p=in;
p.x=a; //a桶倒滿
if(s[p.x][p.y]==0)
p=in;
p.y=b; //b桶倒滿
if(s[p.x][p.y]==0)
}void bfs2(int za,int zb)
while(k
注意:
1.六步操作遍歷時有先後順序,仔細思考!
2.可用queue替代陣列,**可變精簡。
c BFS模板題 水缸灌水 題解
題目描述 有兩個無刻度標誌的水壺,分別可裝x公升和 y公升 x,y為整數,x y 100 的水。設另一方面有一水缸,可用來向水壺灌水或倒出水,兩水壺間,水也可以相互傾灌。已知 x公升為滿壺,y公升為空壺。問如何通過倒水或灌水操作用最少步數能在 y公升壺中量出z z 100 公升的水來。輸入 一行 x...
廣搜模版BFS
define n 305 行 define m 305 列 struct zuobiao p,k char t n m int vis n m n,m,kk int q x,q y,z x,z y int dir 4 2 迴圈處理座標上下左右 priority queueq int judge 判斷...
kmp 模版及兩道模版題
現在我們有母串s,模式串t 我們傳統的字串匹配都思想是,不管此次匹配成功與否,都是模式串向前移動一位繼續匹配,這樣子效率肯定是很慢的,因為我們根本沒有利用到之前已經匹配過的資訊 kmp演算法就是利用之前匹配的資訊,使模式串前移更多的位,使其效率大大提公升,那麼我們怎麼知道什麼時候前移多少位呢,首先我...