http://ac.jobdu.com/problem.php?pid=1457
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
bool visit[101][101][101];
int n, m, s;
typedef struct status {
int a,b,c;
int steps;
void a2b() {
if (a + b <= m) { b = a + b; a = 0; }
else { a -= (m - b); b = m; }
steps++;
}
void a2c() {
if (a + c <= s) { c = a + c; a = 0; }
else { a -= (s - c); c = s; }
steps++;
}
void b2a() {
if (a + b <= n) { a = a + b; b = 0; }
else { b -= (n - a); a = n; }
steps++;
}
void b2c() {
if (b + c <= s) { c = b + c; b = 0; }
else { b -= (s - c); c = s; }
steps++;
}
void c2a() {
if (c + a <= n) { a = a + c; c = 0; }
else { c -= (n - a); a = n; }
steps++;
}
void c2b() {
if (c + b <= m) { b = b + c; c = 0; }
else { c -= (m - b); b = m; }
steps++;
}
bool isEven() {
return (a == b && c == 0) || (b == c && a == 0) || (a == c && b == 0);
}
bool isVisit() {
return visit[a][b][c];
}
void mark() {
visit[a][b][c] = true;
}
}Status;
int bfs() {
Status ss; ss.a = 0, ss.b = 0, ss.c = s, ss.steps = 0;
queue<Status> q;
q.push(ss);
while (!q.empty()) {
Status cs = q.front();
q.pop();
cs.mark();
//printf("%d %d %d\n",cs.a,cs.b,cs.c);
//getchar();
if (cs.isEven()) return cs.steps;
Status ccs;
ccs = cs; ccs.a2b(); if (!ccs.isVisit()) q.push(ccs);
ccs = cs; ccs.a2c(); if (!ccs.isVisit()) q.push(ccs);
ccs = cs; ccs.b2a(); if (!ccs.isVisit()) q.push(ccs);
ccs = cs; ccs.b2c(); if (!ccs.isVisit()) q.push(ccs);
ccs = cs; ccs.c2a(); if (!ccs.isVisit()) q.push(ccs);
ccs = cs; ccs.c2b(); if (!ccs.isVisit()) q.push(ccs);
}
return -1;
}
int main()
{
while (scanf("%d %d %d", &s, &m, &n) != EOF) {
if (n == 0 && m == 0 && s == 0) break;
//fill(visit, visit + (101 * 101 * 101), false);
memset(visit, false, sizeof(visit));
int steps = bfs();
if (steps != -1) {
printf("%d\n",steps);
}
else {
printf("NO\n");
}
}
return 0;
}