随手练——USACO 1.44 母亲的牛奶
作者:互联网
P1215 [USACO1.4]母亲的牛奶 Mother's Milk
洛谷 P1215:https://www.luogu.org/problemnew/show/P1215
解题思想:DFS
大一校内编程比赛的题目了,当时毛都没看懂,现在再拿出来,不能说小意思吧,中等意思吧,
一个杯子往另一个杯子里倒,分两种情况。
假设A杯,B杯(大小关系是不影响的,反过来一样):
需要注意的就是,添加一个flag数组,已经做过的状态,下次不再做了,否则这个递归就是个环了。
#include <iostream> #include <set> using namespace std; set<int>s; bool flag[21][21][21]; int A, B, C; int min(int a,int b) { return a < b ? a : b; } void DFS(int a,int b,int c) { if (flag[a][b][c])return; else flag[a][b][c] = true; if (a > A || b > B || c > C) { return; } if (a == 0) { s.insert(c); } if (a > 0) { //a->b DFS(a - min(B - b, a), b + min(B - b, a), c); //a->c DFS(a - min(C - c, a), b, c + min(C - c, a)); } if (b > 0) { //b->a DFS(a + min(b, A - a), b - min(b, A - a), c); //b->c (a, b - min(b, C - c), c + min(C - c, b)); } if (c > 0) { //c->a DFS(a + min(A - a, c), b, c - min(A - a, c)); //c->b DFS(a, b + min(B - b, c), c - min(c, B - b)); } } int main() { int i = 0; cin >> A >> B >> C; DFS(0, 0, C); set<int>::iterator it = s.begin(); while (it != s.end()) { if ((i++) == s.size() - 1)break; cout << *it << " "; it++; } cout << *it << endl; return 0; }
标签:随手,min,int,DFS,return,flag,USACO,P1215,1.44 来源: https://www.cnblogs.com/czc1999/p/10357619.html