【DFS】Mother's Milk 母亲的牛奶

题目描述

农民约翰有三个容量分别是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;
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值