题意
有三个桶,刚开始第三个是满的,问第一个是0的时候第三个桶的情况。
思路
无脑倒水,只要有水就倒。记录每一种状态是否达到过。
代码
/*ID: mycodeb1LANG: C++TASK: milk3*/#include <bits/stdc++.h>#define LL long long#define lowbit(x) ((x) & (-x))#define MP(a, b) make_pair(a, b)const int MAXN = 25 + 5;const int INF = 0x3f3f3f3f;using namespace std;int aFull, bFull, cFull, dp[MAXN][MAXN][MAXN];set<int> st;void DFS(int a, int b, int c){if (dp[a][b][c]) return;dp[a][b][c] = 1;if (a == 0) st.insert(c);if (a != 0){if (b < bFull)DFS(a - min(a, bFull - b), b + min(a, bFull - b), c);if (c < bFull)DFS(a - min(a, cFull - c), b, c + min(a, cFull - c));}if (b != 0){if (a < aFull)DFS(a + min(b, aFull - a), b - min(b, aFull - a), c);if (c < cFull)DFS(a, b - min(b, cFull - c), c + min(b, cFull - c));}if (c != 0){if (a < aFull)DFS(a + min(c, aFull - a), b, c - min(c, aFull - a));if (b < bFull)DFS(a, b + min(c, bFull - b), c - min(c, bFull - b));}}int main(){//freopen("input.txt", "r", stdin);freopen("milk3.in", "r", stdin);freopen("milk3.out", "w", stdout);int a, b, c, i, j;scanf("%d%d%d", &aFull, &bFull, &cFull);DFS(0, 0, cFull);for (set<int>::iterator it = st.begin(); it != st.end(); it++){if (it == st.begin()) printf("%d", *it);else printf(" %d", *it);}puts("");return 0;}
本文通过递归深度优先搜索的方法解决了一个经典的三桶水问题。该问题要求在初始状态下第三个桶满的情况下,找出第一个桶为空时第三个桶可能的状态。代码采用C++实现,并使用状态记录避免重复计算。
512

被折叠的 条评论
为什么被折叠?



