注意三个容器,有任意两个达到要求就可以了,不是一定要两个杯子。
分6中情况
代码比较长慢慢敲不要搞混了。
直接bfs遍历所有的情况
#include
#include
#include
#include
using namespace std;
int s, n, m;
int ans = 0;
struct node
{
int s, n, m;
int step;
node(int ss, int nn, int mm, int st)
{
s = ss; n = nn; m = mm; step = st;
}
};
queue
que; bool flag[101][101][101]; int bfs() { memset(flag, 0, sizeof(flag)); while(!que.empty()) que.pop(); que.push( node(s, 0, 0, 0) ); flag[s][0][0] = 1; while(!que.empty()) { node tmp = que.front(); que.pop(); // printf("tmp.s=%d tmp.n=%d tmp.m=%d tmp.step=%d\n", tmp.s, tmp.n, tmp.m, tmp.step); int ss, nn, mm; nn = tmp.n, mm = tmp.m;ss = tmp.s; nn += tmp.s; if(nn > n) { ss = nn - n; nn = n; } else { ss = 0; } if(!flag[ss][nn][mm]) { if((nn == mm && !ss) || (nn == ss && !mm) || (mm == ss && !nn)) return tmp.step+1; flag[ss][nn][mm] = 1; que.push( node(ss, nn, mm, tmp.step+1) ); } // printf("ss=%d nn=%d mm=%d tmp.step+1=%d %d\n", ss, nn, mm, tmp.step+1, ((nn == mm && !s) || (nn == ss && !m) || (mm == ss && !n))); nn = tmp.n, mm = tmp.m;ss = tmp.s; mm += tmp.s; if(mm > m) { ss = mm - m; mm = m; } else { ss = 0; } if(!flag[ss][nn][mm]) { if((nn == mm && !ss) || (nn == ss && !mm) || (mm == ss && !nn)) return tmp.step+1; flag[ss][nn][mm] = 1; que.push( node(ss, nn, mm, tmp.step+1) ); } // printf("ss=%d nn=%d mm=%d tmp.step+1=%d %d\n", ss, nn, mm, tmp.step+1, ((nn == mm && !s) || (nn == ss && !m) || (mm == ss && !n))); nn = tmp.n, mm = tmp.m;ss = tmp.s; nn += mm; if(nn > n) { mm = nn - n; nn = n; } else { mm = 0; } if(!flag[ss][nn][mm]) { if((nn == mm && !ss) || (nn == ss && !mm) || (mm == ss && !nn)) return tmp.step+1; flag[ss][nn][mm] = 1; que.push( node(ss, nn, mm, tmp.step+1) ); } // printf("ss=%d nn=%d mm=%d tmp.step+1=%d %d\n", ss, nn, mm, tmp.step+1, ((nn == mm && !s) || (nn == ss && !m) || (mm == ss && !n))); nn = tmp.n, mm = tmp.m;ss = tmp.s; mm += nn; if(mm > m) { nn = mm - m; mm = m; } else { nn = 0; } if(!flag[ss][nn][mm]) { if((nn == mm && !ss) || (nn == ss && !mm) || (mm == ss && !nn)) return tmp.step+1; flag[ss][nn][mm] = 1; que.push( node(ss, nn, mm, tmp.step+1) ); } // printf("ss=%d nn=%d mm=%d tmp.step+1=%d %d\n", ss, nn, mm, tmp.step+1, ((nn == mm && !ss) || (nn == ss && !mm) || (mm == ss && !nn))); nn = tmp.n, mm = tmp.m;ss = tmp.s; ss += nn; nn = 0; if(!flag[ss][nn][mm]) { if((nn == mm && !ss) || (nn == ss && !mm) || (mm == ss && !nn)) return tmp.step+1; flag[ss][nn][mm] = 1; que.push( node(ss, nn, mm, tmp.step+1) ); } // printf("ss=%d nn=%d mm=%d tmp.step+1=%d %d\n", ss, nn, mm, tmp.step+1, ((nn == mm && !s) || (nn == ss && !m) || (mm == ss && !n))); nn = tmp.n, mm = tmp.m;ss = tmp.s; ss += mm; mm = 0; if(!flag[ss][nn][mm]) { if((nn == mm && !ss) || (nn == ss && !mm) || (mm == ss && !nn)) return tmp.step+1; flag[ss][nn][mm] = 1; que.push( node(ss, nn, mm, tmp.step+1) ); } // printf("ss=%d nn=%d mm=%d tmp.step+1=%d %d\n", ss, nn, mm, tmp.step+1, ((nn == mm && !s) || (nn == ss && !m) || (mm == ss && !n))); } return 0; } int main(void) { while(cin >> s >> n >> m && n+m+s>0) { int tmp = bfs(); if(tmp) cout << tmp << endl; else cout << "NO" << endl; } return 0; }