题目描述
Farmer John有三个容量分别是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
题解
记搜水题,搜出所有情况即可。
#include <iostream> #include <algorithm> #include <queue> #include <cstdio> using namespace std; int maxa[4]; int f[6]={1,1,2,2,3,3},s[6]={2,3,1,3,1,2}; int is[21][21][21],ans[21]; queue<int> q; void bfs(int a[4]) { if(!a[1]) ans[a[3]]=1; for(int i=0;i<6;i++) { int temp[4]={a[0],a[1],a[2],a[3]}; temp[f[i]]-=min(a[f[i]],maxa[s[i]]-a[s[i]]); temp[s[i]]+=min(a[f[i]],maxa[s[i]]-a[s[i]]); if(!is[temp[1]][temp[2]][temp[3]]) is[temp[1]][temp[2]][temp[3]]=1,bfs(temp); } } int main() { int a[4]; cin>>a[1]>>a[2]>>a[3]; maxa[1]=a[1],maxa[2]=a[2],maxa[3]=a[3]; a[1]=a[2]=0; bfs(a); for(int i=0,op=0;i<=20;i++) { if(ans[i]) { if(op++) cout<<" "; cout<<i; } } return 0; }