/*
ID: m1590291
TASK: milk3
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <string.h>
#define MAX 25
int A,B,C;
int ans[MAX]; //涂灰的标志数组
int vis[MAX][MAX][MAX]; //dfs的执行数组
/******************************************************************************************************************
思路:
1,找出倒牛奶的6种状态,再深搜就OK
2,6种状态分别是 c->a || c->b;
b->a || b->c;
a->b || a->c;
3,每种状态对应两种情况,能倒满和倒不满
4,深搜的实质,将白色图案涂灰的过程 {找到 (return 条件)和(涂灰条件)是关键}
******************************************************************************************************************/
using namespace std;
void dfs(int a,int b,int c)
{
if(vis[a][b][c]) return ;
vis[a][b][c]=1;
if(a == 0 && !ans[c]) //涂灰条件
ans[c]=1;
if(c >= A-a) dfs(A,b,c-A+a); //c->a
else
dfs(a+c,b,0);
if(c >= B-b) dfs(a,B,c-B+b); //c->b
else
dfs(a,b+c,0);
if(b >= A-a) dfs(A,b-A+a,c); //b->a
else
dfs(a+b,0,c);
if(b >= C-c) dfs(a,b-C+c,C); //b->c
else
dfs(a,0,c+b);
if(a >= B-b) dfs(a-B+b,B,c); //a->b
else
dfs(0,b+a,c);
if(a >= C-c) dfs(a-C+c,b,C); //a->c
else
dfs(0,b,c+a);
}
int main()
{
ifstream fin("milk3.in");
ofstream fout("milk3.out");
while(fin>>A>>B>>C)
{
int flag=1;
memset(vis,0,sizeof(vis));
memset(ans,0,sizeof(ans));
dfs(0,0,C);
for(int i = 0;i <= 20;i ++){
if(ans[i]){
if(flag){
fout<<i;
flag=0;
}
else
fout<<" "<<i;
}
}
fout<<endl;
}
return 0;
}
USACO 1.4-Mother's Milk
最新推荐文章于 2024-02-01 10:39:25 发布