Description
Input
Output
Sample Input
Sample Output
3
#include<iostream> #include<cstdio> #include<queue> #include<algorithm> #include<cstring> using namespace std; const int N = 100 + 5; bool visit[N][N]; int a[6]; class Node { public: int state[3]; int step; }cur, next1; queue<Node>q; void BFS() { while (!q.empty()) q.pop(); cur.state[0] = a[0]; cur.state[1] = cur.state[2] = 0; cur.step = 0; q.push(cur); while (!q.empty()) { cur = q.front(); q.pop(); if ((cur.state[0] == a[0] / 2 && cur.state[1] == a[0] / 2) || (cur.state[0] == a[0] / 2 && cur.state[2] == a[0] / 2) || (cur.state[1] == a[0] / 2 && cur.state[2] == a[0] / 2)) { printf("%d\n", cur.step); return ; } for (int i = 0; i < 3; i++) { if (cur.state[i] > 0) { //找到还有水的杯子 for (int j = 0; j < 3; j++) { if (i == j) continue;//不能倒给自已 next1 = cur; //接下来是i往j里面倒水 if (next1.state[i] + next1.state[j] > a[j]) { //装满另一个杯子还有多 next1.state[i] -= a[j] - next1.state[j]; next1.state[j] = a[j];//杯子满了 } else { next1.state[j] += next1.state[i];//还没满或刚好满 next1.state[i] = 0;//全倒完 } if (!visit[next1.state[1]][next1.state[2]]) { visit[next1.state[1]][next1.state[2]] = true; next1.step++; q.push(next1); } } } } } puts("NO"); } int main() { while (scanf("%d %d %d", &a[0], &a[1], &a[2]) != EOF) { if (a[0] == 0 && a[1] == 0 && a[2] == 0) break; memset(visit, false, sizeof(visit)); if (a[0] % 2 != 0) { //因为三个杯子容量都是整数 puts("NO"); continue; } if (a[1] == a[2]) { //刚好平分 puts("1"); continue; } BFS(); } return 0; }