/* 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; }