7 4 3 4 1 3 0 0 0
NO 3
模拟一下倒水的过程,一共有三种倒法,A向BC,B向AC,C向AB。搜索并记录搜索过的过程就好了。
代码很长,就是都是复制粘贴的,不难。
PS:今天真是活见鬼了,交代码交不上就算了,csdn和虚拟判官都进不去了,重启了电脑才好。交了赶紧睡觉去。
代码如下:
#include <stdio.h> #include <queue> #include <string.h> using namespace std; int a,b,c; int used[111][111][111]; struct node { int x,y,z; int st; }m,n; int min(int x,int y) { if (x < y) return x; return y; } bool check(node x) { if ((x.x == 0 && x.y == x.z) || (x.y == 0 && x.x == x.z) || (x.z == 0 && x.x == x.y)) return true; return false; } int bfs() { queue<node>q; m.x = a; m.y = 0; m.z = 0; m.st = 0; used[a][0][0] = 1; q.push(m); while (!q.empty()) { int trans; //倒水量 m = q.front(); q.pop(); if (check(m)) return m.st; //下面开始6个搜索(由一个杯子向另外两个倒水) if (m.x) { //第一 if (trans = min(m.x , b - m.y)) { n.x = m.x - trans; n.y = m.y + trans; n.z = m.z; n.st = m.st + 1; if (!used[n.x][n.y][n.z]) { q.push(n); used[n.x][n.y][n.z] = 1; } } //第二 if (trans = min(m.x , c - m.z)) { n.x = m.x - trans; n.y = m.y; n.z = m.z + trans; n.st = m.st + 1; if (!used[n.x][n.y][n.z]) { q.push(n); used[n.x][n.y][n.z] = 1; } } } if (m.y) { //第三 if (trans = min(m.y , a - m.x)) { n.x = m.x + trans; n.y = m.y - trans; n.z = m.z; n.st = m.st + 1; if (!used[n.x][n.y][n.z]) { used[n.x][n.y][n.z] = 1; q.push(n); } } //第四 if (trans = min(m.y , c - m.z)) { n.x = m.x; n.y = m.y - trans; n.z = m.z + trans; n.st = m.st + 1; if (!used[n.x][n.y][n.z]) { used[n.x][n.y][n.z] = 1; q.push(n); } } } if (m.z) { //第五 if (trans = min(m.z , a - m.x)) { n.x = m.x + trans; n.y = m.y; n.z = m.z - trans; n.st = m.st + 1; if (!used[n.x][n.y][n.z]) { used[n.x][n.y][n.z] = 1; q.push(n); } } //第六 if (trans = min(m.z , b - m.y)) { n.x = m.x; n.y = m.y + trans; n.z = m.z - trans; n.st = m.st + 1; if (!used[n.x][n.y][n.z]) { q.push(n); used[n.x][n.y][n.z] = 1; } } } } return 0; } int main() { while (~scanf ("%d %d %d",&a,&b,&c) && (a || b || c)) { if (a&1) //先简单的剪枝一下 printf ("NO\n"); else { memset (used,0,sizeof (used)); //什么鬼,浏览器的问题还是代码问题,只是把这一步放到下面就AC了 int ans = bfs(); if (ans) printf ("%d\n",ans); else printf ("NO\n"); } } return 0; }