P1215 [USACO1.4]母亲的牛奶 Mother's Milk
题目描述
农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的。有时,农民把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了。当然每一次灌注都是完全的。由于节约,牛奶不会有丢失。
写一个程序去帮助农民找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。
输入输出格式
输入格式:
单独的一行包括三个整数A,B和C。
输出格式:
只有一行,升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性。
输入输出样例
输入样例#1:
[输入1]
8 9 10
[输入2]
2 5 10
输出样例#1:
[输出1]
1 2 8 9 10
[输出2]
5 6 7 8 9 10
说明
题目翻译来自NOCOW。
USACO Training Section 1.4
爆搜六种情况,判重时只判断a和c就行.
#include<cstdio>
#include<algorithm>
using namespace std; //bool v[25][25][25];
bool v[][];
bool vc[];
int A,B,C,cnt; void dfs(int a,int b,int c)
{
if (v[a][c]) return ;
v[a][c] = true;
if (a==&&!vc[c]) vc[c] = true;;
if (c>)
{
if (a<A) dfs(min(A,a+c),b,max(,c-(A-a))); //c to a
if (b<B) dfs(a,min(B,b+c),max(,c-(B-b))); //c to b
}
if (a>)
{
if (b<B) dfs(max(,a-(B-b)),min(B,b+a),c); //a to b
if (c<C) dfs(max(,a-(C-c)),b,min(C,c+a)); //a to c
}
if (b>)
{
if (a<A) dfs(min(A,a+b),max(,b-(A-a)),c); //b to a
if (c<C) dfs(a,max(,b-(C-c)),min(C,c+b)); //b to c
}
}
int main()
{
scanf("%d%d%d",&A,&B,&C);
dfs(,,C);
for (int i=C-B; i<=C; ++i)
if (vc[i]) printf("%d ",i);
return ;
}