题目描述
农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的。有时,农民把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了。当然每一次灌注都是完全的。由于节约,牛奶不会有丢失。
写一个程序去帮助农民找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。
输入输出格式
输入格式:
单独的一行包括三个整数A,B和C。
输出格式:
只有一行,升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性。
输入输出样例
说明
题目翻译来自NOCOW。
USACO Training Section 1.4
神奇的题目,,
有点儿。。。
思路普遍,,关键是操作。。。
爆搜代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int a,b,c,t;
int ans[22];
bool vis[22][22][22],vis2[22];
void dfs(int x,int y,int z)
{
if(vis[x][y][z])
return ;
vis[x][y][z]=1;
if(!x&&!vis2[z])
{
t++;
ans[t]=z;
vis2[z]=1;
}
if(x>0&&y<b)
{
int tmp=min(b-y,x);
dfs(x-tmp,y+tmp,z);
}
if(x>0&&z<c)
{
int tmp=min(c-z,x);
dfs(x-tmp,y,z+tmp);
}
if(y>0&&x<a)
{
int tmp=min(a-x,y);
dfs(x+tmp,y-tmp,z);
}
if(y>0&&z<c)
{
int tmp=min(c-z,y);
dfs(x,y-tmp,z+tmp);
}
if(z>0&&x<a)
{
int tmp=min(a-x,z);
dfs(x+tmp,y,z-tmp);
}
if(z>0&&y<b)
{
int tmp=min(b-y,z);
dfs(x,y+tmp,z-tmp);
}
}
int main()
{
scanf("%d%d%d",&a,&b,&c);
dfs(0,0,c);
sort(ans+1,ans+t+1);
for(int i=1;i<=t;++i)
printf("%d ",ans[i]);
return 0;
}
如果你不开心,那我就把右边
这个帅傻子分享给你吧,
你看,他这么好看,那么深情的望着你,你还伤心吗?
真的!这照片盯上他五秒钟就想笑了。
一切都会过去的。