1.4.2 Mother's Milk
70912 ワード
/*
ID: awsd1231
PROG: milk3
LANG: C++
*/
#include<iostream>
#include<cstdio>
#include<queue>
#include<set>
using namespace std;
int A, B, C, idx = 0;
int may[25][25][25] = {0};
struct T {
int a, b, c;
}can[10000];
queue<T> ans;
set<int> ansN;
int main() {
freopen("milk3.in", "r", stdin);
freopen("milk3.out", "w", stdout);
cin >> A >> B >> C;
can[idx].a = 0;
can[idx].b = 0;
can[idx].c = C;
ans.push(can[idx]);
may[0][0][C] = 1;
int x[3];
while(!ans.empty()) {//6 ,
if(ans.front().a > B - ans.front().b) { //a->b
x[0] = ans.front().a - B + ans.front().b;
x[1] = B;
x[2] = ans.front().c;
if(may[x[0]][x[1]][x[2]] == 0) {
may[x[0]][x[1]][x[2]] = 1;
can[++idx].a = x[0];
can[idx].b = x[1];
can[idx].c = x[2];
ans.push(can[idx]);
}
} else {
x[0] = 0;
x[1] = ans.front().b + ans.front().a;
x[2] = ans.front().c;
if(may[x[0]][x[1]][x[2]] == 0) {
may[x[0]][x[1]][x[2]] = 1;
can[++idx].a = x[0];
can[idx].b = x[1];
can[idx].c = x[2];
ans.push(can[idx]);
}
}
///////////////////////
if(ans.front().a > C - ans.front().c) { //a->c
x[0] = ans.front().a - C + ans.front().c;
x[1] = ans.front().b;
x[2] = C;
if(may[x[0]][x[1]][x[2]] == 0) {
may[x[0]][x[1]][x[2]] = 1;
can[++idx].a = x[0];
can[idx].b = x[1];
can[idx].c = x[2];
ans.push(can[idx]);
}
} else {
x[0] = 0;
x[1] = ans.front().b;
x[2] = ans.front().a + ans.front().c;
if(may[x[0]][x[1]][x[2]] == 0) {
may[x[0]][x[1]][x[2]] = 1;
can[++idx].a = x[0];
can[idx].b = x[1];
can[idx].c = x[2];
ans.push(can[idx]);
}
}
///////////////////////
if(ans.front().b > A - ans.front().a) { //b->a;
x[0] = A;
x[1] = ans.front().b - A + ans.front().a;
x[2] = ans.front().c;
if(may[x[0]][x[1]][x[2]] == 0) {
may[x[0]][x[1]][x[2]] = 1;
can[++idx].a = x[0];
can[idx].b = x[1];
can[idx].c = x[2];
ans.push(can[idx]);
}
} else {
x[0] = ans.front().a + ans.front().b;
x[1] = 0;
x[2] = ans.front().c;
if(may[x[0]][x[1]][x[2]] == 0) {
may[x[0]][x[1]][x[2]] = 1;
can[++idx].a = x[0];
can[idx].b = x[1];
can[idx].c = x[2];
ans.push(can[idx]);
}
}
///////////////////////
if(ans.front().b > C - ans.front().c) { //b->c
x[0] = ans.front().a;
x[1] = ans.front().b - C + ans.front().c;
x[2] = C;
if(may[x[0]][x[1]][x[2]] == 0) {
may[x[0]][x[1]][x[2]] = 1;
can[++idx].a = x[0];
can[idx].b = x[1];
can[idx].c = x[2];
ans.push(can[idx]);
}
} else {
x[0] = ans.front().a;
x[1] = 0;
x[2] = ans.front().b + ans.front().c;
if(may[x[0]][x[1]][x[2]] == 0) {
may[x[0]][x[1]][x[2]] = 1;
can[++idx].a = x[0];
can[idx].b = x[1];
can[idx].c = x[2];
ans.push(can[idx]);
}
}
///////////////////////
if(ans.front().c > A - ans.front().a) { //c->a
x[0] = A;
x[1] = ans.front().b;
x[2] = ans.front().c - A + ans.front().a;
if(may[x[0]][x[1]][x[2]] == 0) {
may[x[0]][x[1]][x[2]] = 1;
can[++idx].a = x[0];
can[idx].b = x[1];
can[idx].c = x[2];
ans.push(can[idx]);
}
} else {
x[0] = ans.front().a + ans.front().c;
x[1] = ans.front().b;
x[2] = 0;
if(may[x[0]][x[1]][x[2]] == 0) {
may[x[0]][x[1]][x[2]] = 1;
can[++idx].a = x[0];
can[idx].b = x[1];
can[idx].c = x[2];
ans.push(can[idx]);
}
}
///////////////////////
if(ans.front().c > B - ans.front().b) { //c->b
x[0] = ans.front().a;
x[1] = B;
x[2] = ans.front().c - B +ans.front().b;
if(may[x[0]][x[1]][x[2]] == 0) {
may[x[0]][x[1]][x[2]] = 1;
can[++idx].a = x[0];
can[idx].b = x[1];
can[idx].c = x[2];
ans.push(can[idx]);
}
} else {
x[0] = ans.front().a;
x[1] = ans.front().b + ans.front().c;
x[2] = 0;
if(may[x[0]][x[1]][x[2]] == 0) {
may[x[0]][x[1]][x[2]] = 1;
can[++idx].a = x[0];
can[idx].b = x[1];
can[idx].c = x[2];
ans.push(can[idx]);
}
}
///////////////////////
ans.pop();
}
for(int i = 0; i != 25; ++i) {
for(int j = 0; j != 25; ++j) {
if(may[0][i][j]) ansN.insert(j);
}
}
for(set<int>::iterator it = ansN.begin(); it != --ansN.end(); ++it) {
cout << *it << " ";
}
cout << *(--ansN.end()) << endl;
return 0;
}