3511. 倒水问题
有三个杯子,容量分别为 A,B,CA,B,C。
初始时,CC 杯装满了水,而 A,BA,B 杯都是空的。
现在在保证不会有漏水的情况下进行若干次如下操作:
将一个杯子 xx 中的水倒到另一个杯子 yy 中,当 xx 空了或者 yy 满了时就停止(满足其中一个条件才停下)。
请问,在操作全部结束后,CC 中的水量有多少种可能性。
输入格式
输入包含多组测试数据。
每组数据占一行,包含三个整数 A,B,CA,B,C。
输出格式
每组数据输出一个结果,占一行。
数据范围
0≤A,B,C≤40000≤A,B,C≤4000,
每个输入最多包含 100100 组数据。
输入样例:
0 5 5
2 2 4
输出样例:
2
3
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <map>
using namespace std;
int A,B,C;
map<int,int>mp,Mp;
void dfs(int a,int b,int c)
{
//cout << a<<' '<<b<<' '<<c<<endl;
if(mp[a*4000+b])
return ;
if(a<0||b<0||c<0)
return ;
mp[a*4000+b]++;
Mp[c]++;
dfs(a-min(a,B-b),b+min(a,B-b),c);
dfs(a-min(a,C-c),b,c+min(a,C-c));
dfs(a+min(A-a,b),b-min(A-a,b),c);
dfs(a,b-min(b,C-c),c+min(b,C-c));
dfs(a+min(A-a,c),b,c-min(A-a,c));
dfs(a,b+min(B-b,c),c-min(B-b,c));
}
int main()
{
while(cin >> A>>B>>C)
{
dfs(0,0,C);
cout << Mp.size()<<endl;
Mp.clear();
mp.clear();
}
}