[宽度优先搜索BFS]母亲的牛奶
题目描述
农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的。有时,农民把牛奶从一个桶倒到 另一个桶中,直到被灌桶装满或原桶空了。当然每一次灌注都是完全的。由于节约, 牛奶不会有丢失。写一个程序去帮助农民找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。
输入
单独的一行包括三个整数A,B和C。
输出
只有一行,升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性。
样例输入
8 9 10
样例输出
1 2 8 9 10
参考了某些大佬DFS的解法,看不懂,穷举:A给B倒,A给C倒,B给C倒,这三种再反过来,就一共是6种倒法,然后每种操作有两个情况,比如,A向B倒,一种情况是A倒干净了,还有一种情况是A没倒干净,B已经满了。
下面上代码。
#include<bits/stdc++.h> using namespace std; int d[10005][4]; int n[10005]; bool bz[20][20][20]; int a[4]; void dg() { int head=0,tail=1; d[1][1]=d[1][2]=0; d[1][3]=a[3]; bz[0][0][a[3]]=1; while(head<tail) { head++; for(int i=1;i<=3;i++) { for(int j=1;j<=3;j++) { if(d[tail][1]==0) { n[d[tail][3]]++; } if(i!=j && d[head][i]>0 && d[head][j]<a[j]) { tail++; int z=6-i-j; d[tail][z]=d[head][z]; if(d[head][i]<(a[j]-d[head][j])) { d[tail][i]=0; d[tail][j]=d[head][j]+d[head][i]; } else { d[tail][i]=d[head][i]-(a[j]-d[head][j]); d[tail][j]=a[j]; } if(bz[d[tail][1]][d[tail][2]][d[tail][3]]) { tail--; } else { bz[d[tail][1]][d[tail][2]][d[tail][3]]=1; } } } } } } int main() { cin>>a[1]>>a[2]>>a[3]; dg(); for(int i=0;i<=10005;i++) { if(n[i]>=1) { cout<<i<<" "; } } }
在CSDN博客上也有发布:http://t.csdn.cn/iYYDS