注意三个容器,有任意两个达到要求就可以了,不是一定要两个杯子。
分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;
}

通过BFS算法解决将一定量的可乐平均分配到两个不同容量杯子的问题,代码详细展示了实现过程。

8224

被折叠的 条评论
为什么被折叠?



