7 4 3 4 1 3 0 0 0
NO 3
解析:bfs进行模拟比较简单,但是我做这题的时候把题目给看错了,看成是初始装在第三个杯子中,可题目说是在第一杯水中,因为这个失误WA了好多次。都是怪我没有认真审题。
#include <stdio.h> #include <string.h> #include <queue> #include <algorithm> using namespace std; struct Node { int v[3],dist; }; const int MAXN = 100 + 5; int vis[MAXN][MAXN],jug[3]; bool judge(int a,int b,int c) { if(a == b && a == jug[0]/2) { return true; } if(a == c && a == jug[0]/2) { return true; } if(b == c && b == jug[0]/2) { return true; } return false; } int bfs() { memset(vis,0,sizeof(vis)); queue<Node> q; Node start; start.dist = 0; start.v[0] = jug[0]; start.v[1] = 0; start.v[2] = 0; q.push(start); vis[jug[0]][0] = true; while(!q.empty()) { Node front = q.front(); q.pop(); if(judge(front.v[0],front.v[1],front.v[2])) { return front.dist; } for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { if(i == j) { continue; } if(!front.v[i] || front.v[j] == jug[j]) { continue; } int amount = min(front.v[i],jug[j] - front.v[j]); Node tmp; memcpy(&tmp,&front,sizeof(front)); tmp.dist = front.dist + 1; tmp.v[i] -= amount; tmp.v[j] += amount; if(!vis[tmp.v[0]][tmp.v[1]]) { vis[tmp.v[0]][tmp.v[1]] = true; q.push(tmp); } } } } return 0; } int main() { while(scanf("%d%d%d",&jug[0],&jug[1],&jug[2]) != EOF && (jug[0] || jug[1] || jug[2])) { if(jug[0] % 2) { printf("NO\n"); continue; } int ans = bfs(); if(ans) { printf("%d\n",ans); }else { printf("NO\n"); } } return 0; }