题目描述
农民约翰有三个挤奶桶的容量A,B和C升。 数字A,B和C中的每一个为1至20的整数,包括1和20。 最初,桶A和瓶B都是空的,而桶C已经满了牛奶。 有时,FJ将牛奶从一个桶倒入另一个桶中,直到第二个桶装满,或者第一个桶是空的。 一旦开始,必须完成倾倒,当然。 节俭,不会抛出牛奶。编写一个程序来帮助FJ确定在桶C中可以离开的牛奶量,当他从上面的三个桶开始时,在桶中倒入牛奶一段时间,然后注意到A桶是空的。
程序名称:milk3
输入格式
具有三个整数A,B和C的单行。
输入 (file milk3.in)
8 9 10
输出格式
一行,当桶A为空时,可以在桶C中的所有可能的牛奶量排序列表。
输出(file milk3.out)
1 2 8 9 10输入 (file milk3.in)
2 5 10输出(file milk3.out)
5 6 7 8 9 10解题思路
本题主要的解题思路在于,在每次到的过程中出现第一个是0的第三个瓶内的牛奶数记录下来。
解题代码
/*
ID: 15189822
PROG: milk3
LANG: C++
*/
#include<iostream>
#include<cstring>
#include<fstream>
using namespace std;
ifstream fin("milk3.in");
ofstream fout("milk3.out");
const int N = 20;
int a,b,c;
int f[N+1];
int jg[N+1];
int d[N+1][N+1];
void dfs(int x,int y,int z){
int t;
d[x][y]=1;
if (x==0){
f[z]=1;
}
if (x>0&&y!=b){
t=min(x,b-y);
if (!d[x-t][y+t]) dfs(x-t,y+t,z);
}
if (x>0&&z!=c){
t=min(x,c-z);
if (!d[x-t][y]) dfs(x-t,y,z+t);
}
if (y>0&&x!=a){
t=min(a-x,y);
if (!d[x+t][y-t]) dfs(x+t,y-t,z);
}
if (y>0&&z!=c){
t=min(c-z,y);
if (!d[x][y-t]) dfs(x,y-t,z+t);
}
if (z>0&&x!=a){
t=min(a-x,z);
if (!d[x+t][y]) dfs(x+t,y,z-t);
}
if (z>0&&y!=b){
t=min(b-y,z);
if (!d[x][y+t]) dfs(x,y+t,z-t);
}
}
int main(){
memset (f,0,sizeof(f));
memset (d,0,sizeof(d));
fin>>a>>b>>c;
dfs(0,0,c);
int i,j,s1=0,s2=0;
for (i=0;i<=N;i++){
if (f[i]){
jg[s1]=i;
s1++;
}
}
for (i=0;i<s1-1;i++){
fout<<jg[i]<<" ";
}
fout<<jg[s1-1]<<endl;
return 0;
}
扫描二维码关注公众号,回复:
11960035 查看本文章