题目描述
农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的。有时,农民把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了。当然每一次灌注都是完全的。由于节约,牛奶不会有丢失。
写一个程序去帮助农民找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。
输入输出格式
输入格式:
单独的一行包括三个整数A,B和C。
输出格式:
只有一行,升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性。
输入输出样例
输入样例#1:
[输入1] 8 9 10 [输入2] 2 5 10
输出样例#1:
[输出1] 1 2 8 9 10 [输出2] 5 6 7 8 9 10
说明
题目翻译来自NOCOW。
USACO Training Section 1.4
【分析】
很简单的搜索啦,各种情况都考虑到就行了,懒得写注释看起来可能有点麻烦。
【代码】
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int a, b, c; 5 bool vis[105][105], v[105]; 6 7 void dfs(int x, int y, int z) { 8 if (x<0 || x>a || y<0 || y>b || z<0 || z>c || vis[x][y]) 9 return; 10 if (x==0) 11 v[z]=true; 12 vis[x][y]=true; 13 dfs(0,y+x,z); 14 dfs(0,y,z+x); 15 dfs(x+y,0,z); 16 dfs(x,0,z+y); 17 dfs(x+z,y,0); 18 dfs(x,y+z,0); 19 dfs(a,y,z-(a-x)); 20 dfs(a,y-(a-x),z); 21 dfs(x-(b-y),b,z); 22 dfs(x,b,z-(b-y)); 23 dfs(x-(c-z),y,c); 24 dfs(x,y-(c-z),c); 25 } 26 27 int main() { 28 cin >> a >> b >> c; 29 dfs(0, 0, c); 30 for (int i=0;i<=100;++i) 31 if (v[i]) 32 cout << i << " "; 33 cout << endl; 34 }
洛谷 P1215 [USACO1.4]母亲的牛奶 Mother's Milk
时间: 2024-12-28 23:50:36