The main idea of the topic
There are three milk buckets a, b and c. the capacity of each milk bucket is an integer of 1 to 20. At the beginning, a, b are empty, c are full, and they can pour each other. When a bucket is empty, how about the volume of milk in c bucket?
S amp le input & output
sample input 1
8 9 10
sample output 1
1 2 8 9 10
sample input 2
2 5 10
sample output 2
5 6 7 8 9 10
Analysis & Reflection
Continue to help recall a question about dfs.
1. Deduce the state, judge the state and trace back.
2. Compared with bfs, authorities are the same, de duplication and a bit of hashing.
3. When you output the answer, you forget 0, which is a very easy point to forget.
Code
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int a, b, c, atop, btop, ctop; int ans[22], vis[22][22]; void dfs(int x, int y) { if(vis[x][y]) return; vis[x][y] = 1; if(!x) ans[ctop - b]++; int cha, dao; { cha = btop - b; dao = min(a, cha); a -= dao; b += dao; dfs(a, b); a += dao; b -= dao; } { cha = atop - a; dao = min(b, cha); b -= dao; a += dao; dfs(a, b); b += dao; a -= dao; } { cha = ctop - c; dao = min(a, cha); a -= dao; c += dao; dfs(a, b); a += dao; c -= dao; } { cha = atop - a; dao = min(c, cha); c -= dao; a += dao; dfs(a, b); c += dao; a -= dao; } { cha = btop - b; dao = min(c, cha); c -= dao; b += dao; dfs(a, b); c += dao; b -= dao; } { cha = ctop - c; dao = min(b, cha); b -= dao; c += dao; dfs(a, b); b += dao; c -= dao; } return ; } int anss[30], tot; int main() { freopen("milk3.in", "r", stdin); freopen("milk3.out", "w", stdout); cin >> atop >> btop >> ctop; c = ctop; dfs(a, b); for(int i = 0; i <= 20; i++) if(ans[i]) anss[++tot] = i; for(int i = 1; i < tot; i++) cout << anss[i] << " "; cout << anss[tot] << endl; return 0; }
Remarks
Finally, we need to add a transfer line