USACO 1.4.4 Mother's Milk
题意:
给定A,B,C三个杯子的容积(0-20的整数),初始状态为C满牛奶,每一次互相倒必须有一个灌满或者一个为空,
求出所有当A为空的时候,C当前牛奶的状态的数值,从小到大输出
解法:
搜索,深度优先和宽度优先都可以。需要一个数组来记录状态的访问情况,
下面采用dfs来进行求解,states数组标记访问状态,ans数组记录结果
/* ID: lsswxr1 PROG: milk3 LANG: C++ */ #include <iostream> #include <vector> #include <map> #include <list> #include <set> #include <deque> #include <stack> #include <queue> #include <algorithm> #include <cmath> #include <cctype> #include <cstdio> #include <iomanip> #include <cmath> #include <cstdio> #include <string> #include <cstring> #include <fstream> using namespace std; #define USACO #ifdef USACO #define cin fin #define cout fout #endif ////////////////////////////////////////////////////////////////////////// ///宏定义 const int INF = 1000000000; const int MAXN = 21; const int maxn = MAXN; ///全局变量 和 函数 int states[maxn][maxn][maxn]; bool ans[maxn]; int A, B, C; void dfs(int curA, int curB, int curC) { if (curA > A || curB > B || curC > C) { return; } if (states[curA][curB][curC]) { return; } states[curA][curB][curC] = true; if (curA == 0) { ans[curC] = true; } //测试从A倒 if (curA > 0) { if (curA + curB <= B) // A -> B { dfs(0, curB + curA, curC); } else { dfs(curA - (B - curB), B, curC); } if (curA + curC <= C) // A -> C { dfs(0, curB, curC + curA); } else { dfs(curA - (C - curC), curB, C); } } //测试从B倒 if (curB > 0) { if (curA + curB <= A) // B -> A { dfs(curA + curB, 0, curC); } else { dfs(A, curB - (A - curA), curC); } if (curC + curB <= C) // B -> C { dfs(curA, 0, curB + curC); } else { dfs(curA, curB - (C - curC), C); } } //测试从C倒 if (curC > 0) { if (curC + curA <= A) // C -> A { dfs(curA + curC, curB, 0); } else { dfs(A, curB, curC - (A - curA)); } if (curC + curB <= B) // C -> B { dfs(curA, curB + curC, 0); } else { dfs(curA, B, curC - (B - curB)); } } } int main() { #ifndef USACO freopen("D:\\input.txt", "r", stdin); #endif #ifdef USACO ofstream fout ("milk3.out"); ifstream fin ("milk3.in"); #endif while (cin >> A >> B >> C) { memset(states, 0, sizeof(states)); memset(ans, 0, sizeof(ans)); dfs(0, 0, C); int cnt = 0; for (int i = 0; i < maxn; i++) { if (ans[i]) { if (cnt == 0) { cout << i; cnt++; } else { cout << " " << i; } } } cout << endl; } ///结束 return 0; }