题目描述
农民约翰有三个容量分别是A,B,C升的桶,A、B、C分别是三个从1到20的整数。
最初,A和B桶都是空的,而C桶是装满牛奶的。
有时,约翰把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了。由于节约,牛奶不会有丢失。
写一个程序去帮助约翰找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。
输入:
第1行:3个整数A,B和C。
输出:
第1行:升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性。
样例输入1:
2 5 10
样例输出1:
5 6 7 8 9 10
样例输入2:
8 9 10
样例输出2:
1 2 8 9 10
思路:
参考了某些大佬的DFS解法,理解不上去,还是这个最简单了,穷举:A给B倒,A给C倒,B给C倒,这三种再反过来,就一共是6种倒法,然后每种操作有两个情况,比如,A向B倒,一种情况是A倒干净了,还有一种情况是A没倒干净,B已经满了。
下面上代码。
#include <bits/stdc++.h>
using namespace std;
int A,B,C;
bool ans[100]; // C中所有可能的结果 s[i] = true i就是可能的结果
bool vis[100][100][100];
void dfs(int a, int b, int c){ // A,B,C 3个杯中当前的牛奶量
if(vis[a][b][c]){
return;
}
vis[a][b][c] = true;
if(a == 0 && !ans[c]){
ans[c] = true;
}
if(a >= B-b){ // A向B倒, B-b是B桶中还有多少容量 如果 a >= B-b 说明 B被倒满,A倒不完
dfs(a-B+b,B,c);
}else{
dfs(0,b+a,c); // A中的牛奶可以全部倒进B中
}
if(b >= A-a){
dfs(A,b-A+a,c);
}else{
dfs(a+b,0,c);
}
if(a >= C-c){
dfs(a-C+c,b,C);
}else{
dfs(0,b,a+c);
}
if(c >= A-a){
dfs(A,b,c-A+a);
}else{
dfs(a+c,b,0);
}
if(b >= C-c){
dfs(a,b-C+c,C);
}else{
dfs(a,0,b+c);
}
if(c >= B-b){
dfs(a,B,c-B+b);
}else{
dfs(a,b+c,0);
}
}
int main(){
scanf("%d%d%d",&A,&B,&C);
dfs(0,0,C);
for(int i = 1; i <= C; i++){
if(ans[i]){
cout << i << " " ;
}
}
return 0;
}