有三个杯子,容量分别为 A,B,C。初始时,C杯装满了水,而 A,B杯都是空的。现在在保证不会有漏水的情况下进行若干次如下操作:
将一个杯子 x中的水倒到另一个杯子 y 中,当 x 空了或者 y满了时就停止(满足其中一个条件才停下)。
请问,在操作全部结束后,C中的水量有多少种可能性。
输入格式
输出格式
数据范围
0 5 5
2 2 4
2
3
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_set>
using namespace std;
typedef long long LL;
const LL B = 10000; // 每个水桶最大4000,所以采用一个LL类型的数来存储三个水桶的状态
int C[3];
unordered_set<LL> states; // 三个桶的状态
unordered_set<int> cs; // 桶C的状态
LL get(int c[])
{
return c[2] * B * B + c[1] * B + c[0];
}
void pour(int c[], int i, int j)
{
int t = min(c[i], C[j] - c[j]);
c[i] -= t, c[j] += t;
}
/*
深度搜索:
输入:三个水桶内已经装水的容量 数组
功能:
1. 将三个水桶的状态加入states;
2. 将C水桶此时所装水的容量加入cs;
3. 三个水桶之间互相倒水,如果出现不在states内的状态,就对此时的状态进行fds;
*/
void dfs(int c[])
{
states.insert(get(c));
cs.insert(c[2]);
int a[3];
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
if (i != j)
{
memcpy(a, c, sizeof a);
pour(a, i, j); // i水桶给j水桶倒水
if (!states.count(get(a)))
dfs(a);
}
}
int main()
{
while (cin >> C[0] >> C[1] >> C[2])
{
states.clear();
cs.clear();
int c[3] = {0, 0, C[2]}; // 三个桶内水的容量
dfs(c);
cout << cs.size() << endl;
}
return 0;
}