题目大意:中文题。一开始以为一定要两个杯子相同,后来发现瓶子也是可以当杯子用的,只要均分就行……天真了
解题思路:六个入口 BFS,没什么难的,复制的时候漏改了调了好久才发现
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<string>
#include<queue>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
const int INF = 0x3f3f3f3f;
const int NINF = -INF -1;
const int MAXN = 100+10;
using namespace std;
struct point {
int s, n, m;
int cnt;
};
bool vis[MAXN][MAXN][MAXN];
int S, N, M;
int bfs() {
queue<point> q;
point p;
p.s = S;
p.n = p.m = p.cnt = 0;
q.push(p);
vis[p.s][p.n][p.m] = 1;
while (!q.empty()) {
point now = q.front();
q.pop();
// printf("%d %d %d %d\n", now.s, now.n, now.m, now.cnt);
if ((now.s == S/2 && now.n == S/2)||
(now.s == S/2 && now.m == S/2)||
(now.n == S/2 && now.m == S/2))
return now.cnt;
for (int i = 0; i < 6; i++) {
p = now;
p.cnt = now.cnt+1;
if (i == 0) { //s->n
p.n += p.s;
p.s = 0;
if (p.n > N) {
p.s = p.n - N;
p.n = N;
}
}
if (i == 1) { //s->m
p.m += p.s;
p.s = 0;
if (p.m > M) {
p.s = p.m - M;
p.m = M;
}
}
if (i == 2) { //n->s
p.s += p.n;
p.n = 0;
if (p.s > S) continue;
}
if (i == 3) { //n->m
p.m += p.n;
p.n = 0;
if (p.m > M) {
p.n = p.m - M;
p.m = M;
}
}
if (i == 4) { //m->s
p.s += p.m;
p.m = 0;
if (p.s > S) continue;
}
if (i == 5) { //m->n
p.n += p.m;
p.m = 0;
if (p.n > N) {
p.m = p.n - N;
p.n = N;
}
}
if (!vis[p.s][p.n][p.m]) {
q.push(p);
vis[p.s][p.n][p.m] = 1;
}
}
}
return -1;
}
int main() {
while (scanf("%d%d%d", &S, &N, &M) && S+N+M) {
memset(vis, 0, sizeof(vis));
int ans = -1;
if (S%2 == 0) ans = bfs();
if (ans == -1) printf("NO\n");
else printf("%d\n", ans);
}
return 0;
}