广搜题,分为 6 种情况,s --> n,s --> m,n --> s,n --> m, m --> s,m --> n,使用三维数组记录访问情况。
#include <iostream>
#include <queue>
using namespace std;
const int MAXN = 105;
bool vis[MAXN][MAXN][MAXN]; //访问情况
int s, n, m;
struct node
{
int s, n, m;
int step; //次数
};
int BFS()
{
if (s % 2 == 1)
return -1;
memset(vis, 0, sizeof(vis));
int half = s / 2;
queue<node> q;
node now;
now.s = s;
now.n = 0;
now.m = 0;
now.step = 0;
q.push(now);
vis[now.s][now.n][now.m] = 1;
while (!q.empty())
{
now = q.front();
q.pop();
if ((now.s == now.n && now.s == half) || (now.s == now.m && now.s == half) || (now.m == now.n && now.m == half))
return now.step;
node next;
if (now.s && n - now.n > 0) // s --> n
{
if (now.s > n - now.n)
{
next.s = now.s - (n - now.n);
next.n = n;
next.m = now.m;
}
else
{
next.s = 0;
next.n = now.n + now.s;
next.m = now.m;
}
if (vis[next.s][next.n][next.m] == 0)
{
vis[next.s][next.n][next.m] = 1;
next.step = now.step + 1;
q.push(next);
}
}
if (now.s && m - now.m > 0) // s --> m
{
if (now.s > m - now.m)
{
next.s = now.s - (m - now.m);
next.n = now.n;
next.m = m;
}
else
{
next.s = 0;
next.n = now.n;
next.m = now.m + now.s;
}
if (vis[next.s][next.n][next.m] == 0)
{
vis[next.s][next.n][next.m] = 1;
next.step = now.step + 1;
q.push(next);
}
}
if (now.n && s - now.s > 0) // n --> s
{
if (now.n > s - now.s)
{
next.s = s;
next.n = now.n - (s - now.s);
next.m = now.m;
}
else
{
next.s = now.s + now.n;
next.n = 0;
next.m = now.m;
}
if (vis[next.s][next.n][next.m] == 0)
{
vis[next.s][next.n][next.m] = 1;
next.step = now.step + 1;
q.push(next);
}
}
if (now.n && m - now.m > 0) // n --> m
{
if (now.n > m - now.m)
{
next.s = now.s;
next.n = now.n - (m - now.m);
next.m = m;
}
else
{
next.s = now.s;
next.n = 0;
next.m = now.m + now.n;
}
if (vis[next.s][next.n][next.m] == 0)
{
vis[next.s][next.n][next.m] = 1;
next.step = now.step + 1;
q.push(next);
}
}
if (now.m && s - now.s > 0) // m --> s
{
if (now.m > s - now.s)
{
next.s = s;
next.n = now.n;
next.m = now.m - (s - now.s);
}
else
{
next.s = now.s + now.m;
next.n = now.n;
next.m = 0;
}
if (vis[next.s][next.n][next.m] == 0)
{
vis[next.s][next.n][next.m] = 1;
next.step = now.step + 1;
q.push(next);
}
}
if (now.m && n - now.n > 0) // m --> n
{
if (now.m > n - now.n)
{
next.s = now.s;
next.n = n;
next.m = now.m - (n - now.n);
}
else
{
next.s = now.s;
next.n = now.n + now.m;
next.m = 0;
}
if (vis[next.s][next.n][next.m] == 0)
{
vis[next.s][next.n][next.m] = 1;
next.step = now.step + 1;
q.push(next);
}
}
}
return -1;
}
int main()
{
while (cin >> s >> n >> m)
{
if (s == 0 && n == 0 && m == 0)
break;
int ans = BFS();
if (ans < 0)
cout << "NO" << endl;
else
cout << ans << endl;
}
return 0;
}
继续加油。