题解
2025-10-17 20:21:06
发布于:广东
2阅读
0回复
0点赞
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll a, b, c;
ll vis[110][110][110];
set<ll> st;
// x 代表第一个桶真实存储的牛奶升数
// y 代表第二个桶真实存储的牛奶升数
// z 代表第三个桶真实存储的牛奶升数
void dfs(ll x, ll y, ll z) {
if (x == 0) {
st.insert(z);
}
if (vis[x][y][z]) return;
vis[x][y][z] = 1;
// 从第一个桶倒到第二个桶
if (x + y <= b) {
dfs(0, x + y, z);
} else {
dfs(x - (b - y), b, z);
}
// 从第一个桶倒到第三个桶
if (x + z <= c) {
dfs(0, y, x + z);
} else {
dfs(x - (c - z), y, c);
}
// 从第二个桶倒到第一个桶
if (y + x <= a) {
dfs(y + x, 0, z);
} else {
dfs(a, y - (a - x), z);
}
// 从第二个桶倒到第三个桶
if (y + z <= c) {
dfs(x, 0, y + z);
} else {
dfs(x, y - (c - z), c);
}
// 从第三个桶倒到第一个桶
if (z + x <= a) {
dfs(z + x, y, 0);
} else {
dfs(a, y, z - (a - x));
}
// 从第三个桶倒到第二个桶
if (z + y <= b) {
dfs(x, z + y, 0);
} else {
dfs(x, b, z - (b - y));
}
}
int main() {
cin >> a >> b >> c;
dfs(0, 0, c);
for (auto c : st) cout << c << ' ';
return 0;
}
这里空空如也

有帮助,赞一个