#include<iostream>
#include<queue>
using namespace std;
struct cola { int s, n, m;int ans; }a;
int vis[101][101][101];
int main() {
int s, n, m;
while (cin >> s >> n >> m) {
bool judge = 0;
if (s == 0 && n == 0 && m == 0)break;
queue <cola> c;
a.s = s, a.n = 0, a.m = 0, a.ans = 0;
c.push(a);
for (int i = 0; i < 100; i++) {
for (int j = 0; j <= 100; j++) {
for (int k = 0; k <= 100; k++) { vis[i][j][k] = 0; }
}
}cola bef, next;
vis[s][0][0] = 1;
if (s % 2 == 1) judge = 0;
else {
while (!c.empty()) {
bef = c.front();//储存根节点
c.pop();//去除
if ((bef.s ==(s/2)&& bef.n==(s/2) ) || ((bef.s == (s / 2) && bef.m == (s / 2)))){
judge = 1; break;
}
int left_s = s - bef.s, left_n = n - bef.n, left_m = m - bef.m;
if (bef.s >= left_n) { next.s = bef.s - left_n; next.n = n; next.m = bef.m; }//添加子节点
else { next.s = 0; next.n = bef.n + bef.s; next.m = bef.m; }
if (vis[next.s][next.n][next.m] == 0) {
next.ans = bef.ans + 1;
vis[next.s][next.n][next.m] = 1;
c.push(next);
}//s->n 1
if (bef.s >= left_m) { next.s = bef.s - left_m; next.m = m; next.n = bef.n; }//添加子节点
else { next.s = 0; next.m = bef.m + bef.s; next.n = bef.n; }
if (vis[next.s][next.n][next.m] == 0) {
next.ans = bef.ans + 1;
vis[next.s][next.n][next.m] = 1;
c.push(next);
}//s->m 2
if (bef.n >= left_m) { next.n = bef.n - left_m; next.m = m; next.s = bef.s; }
else { next.n = 0; next.m = bef.m + bef.n; next.s = bef.s; }
if (vis[next.s][next.n][next.m] == 0) {
next.ans = bef.ans + 1;
vis[next.s][next.n][next.m] = 1;
c.push(next);
}//n->m 3
if (bef.n < left_s) { next.n = 0; next.s = bef.n + bef.s; next.m = bef.m; }
if (vis[next.s][next.n][next.m] == 0) {
next.ans = bef.ans + 1;
vis[next.s][next.n][next.m] = 1;
c.push(next);
}//n->s 4
if (bef.m >= left_n) { next.n = n; next.m = bef.m - left_n; next.s = bef.s; }
else { next.m = 0; next.n = bef.m + bef.n; next.s = bef.s; }
if (vis[next.s][next.n][next.m] == 0) {
next.ans = bef.ans + 1;
vis[next.s][next.n][next.m] = 1;
c.push(next);
}//m->n
if (bef.m < left_s) { next.m = 0; next.s = bef.m + bef.s; next.n = bef.n; }
if (vis[next.s][next.n][next.m] == 0) {
next.ans = bef.ans + 1;
vis[next.s][next.n][next.m] = 1;
c.push(next);
}
}
}
if (judge)cout << bef.ans << endl;
else cout << "NO" << endl;
}
}
bfs 非常可乐
最新推荐文章于 2024-05-21 23:16:53 发布