题目描述
农民约翰有三个容量分别是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
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cmath>
#define N 25
using namespace std;
bool vis[N][N];
int a,b,c;
int x,y,z;
inline void dfs(int a,int b,int c,int p)
{
if(vis[a][c])return;
vis[a][c]=1;
if(p!=3&&a>0&&b<y)//1
{
if(a>=y-b)
{
//a-=y-b;
//b=y;
dfs(a-y+b,y,c,1);
}
else
{
//b+=a;
//a=0;
dfs(0,b+a,c,1);
}
}
if(p!=5&&a>0&&c<z)//2
{
if(a>=z-c)
{
//a-=z-c;
//c=y;
dfs(a-z+c,b,z,2);
}
else
{
//c+=a;
//a=0;
dfs(0,b,c+a,2);
}
}
if(p!=1&&b>0&&a<x)//3
{
if(b>=x-a)
{
//b-=x-a;
//a=x;
dfs(x,b-x+a,c,3);
}
else
{
//a+=b;
//b=0;
dfs(b+a,0,c,3);
}
}
if(p!=6&&b>0&&c<z)//4
{
if(b>=z-c)
{
//b-=z-c;
//c=z;
dfs(a,b-z+c,z,4);
}
else
{
//b+=a;
//a=0;
dfs(a,0,c+b,4);
}
}
if(p!=2&&c>0&&a<x)//5
{
if(c>=x-a)
{
//c-=x-a;
//a=x;
dfs(x,b,c-x+a,5);
}
else
{
//a+=c;
//c=0;
dfs(a+c,b,0,5);
}
}
if(p!=4&&c>0&&b<y)//6
{
if(c>=y-b)
{
//c-=y-b;
//b=y;
dfs(a,y,c-y+b,6);
}
else
{
//b+=c;
//c=0;
dfs(a,b+c,0,6);
}
}
}
int main()
{
scanf("%d%d%d",&x,&y,&z);
dfs(0,0,z,0);
for(int i=0;i<=24;i++)
if(vis[0][i])
printf("%d ",i);
}