C++搜索与回溯算法之母亲的牛奶
2017-06-20 13:50
281 查看
母亲的牛奶
题目描述
农民约翰有三个容量分别是A,B,C升的桶,A、B、C分别是三个从1到20的整数。最初,A和B桶都是空的,而C桶是装满牛奶的。
有时,约翰把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了。由于节约,牛奶不会有丢失。
写一个程序去帮助约翰找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。
输入
第1行:3个整数A,B和C。输出
第1行:升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性。样例输入
2 5 10
样例输出
5 6 7 8 9 10
代码
#include<cstdio>#include<algorithm>
using namespace std;
bool check[25][25][25];
bool num[25];
int ra,rb,rc;
void dfs(int a,int b,int c)
{
if(check[a][b][c]) return ;
else check[a][b][c]=true;
if(a==0) num[c]=true;
if(a!=0&&b<rb) dfs(a-min(rb-b,a),b+min(rb-b,a),c);
if(a!=0&&c<rc) dfs(a-min(rc-c,a),b,c+min(rc-c,a));
if(b!=0&&a<ra) dfs(a+min(ra-a,b),b-min(ra-a,b),c);
if(b!=0&&c<rc) dfs(a,b-min(rc-c,b),c+min(rc-c,b));
if(c!=0&&a<ra) dfs(a+min(ra-a,c),b,c-min(ra-a,c));
if(c!=0&&b<rb) dfs(a,b+min(rb-b,c),c-min(rb-b,c));
}
int main()
{
scanf("%d%d%d",&ra,&rb,&rc);
dfs(0,0,rc);
int tot=20;
while(!num[tot]) tot--;
for(int i=0;i<tot;i++)
if(num[i]) printf("%d ",i);
printf("%d",tot);
}
或者这样:
#include<cstdio>
#include<algorithm>
using namespace std;
bool check[25][25][25];
bool num[25];
int ra,rb,rc;
void dfs(int a,int b,int c)
{
if(check[a][b][c]) return ;
check[a][b][c]=true;
if(a==0) num[c]=true;
dfs(a-min(rb-b,a),b+min(rb-b,a),c);
dfs(a-min(rc-c,a),b,c+min(rc-c,a));
dfs(a+min(ra-a,b),b-min(ra-a,b),c);
dfs(a,b-min(rc-c,b),c+min(rc-c,b));
dfs(a+min(ra-a,c),b,c-min(ra-a,c));
dfs(a,b+min(rb-b,c),c-min(rb-b,c));
}
int main()
{
scanf("%d%d%d",&ra,&rb,&rc);
dfs(0,0,rc);
int tot=20;
while(!num[tot]) tot--;
for(int i=0;i<tot;i++)
if(num[i]) printf("%d ",i);
printf("%d",tot);
}
相关文章推荐
- C++搜索与回溯算法之The Castle
- C++搜索与回溯算法之符号三角形
- C++搜索与回溯算法之全排列问题
- C++搜索与回溯算法之字符串全排列
- C++搜索与回溯算法之Lake Counting(数湖)
- C++搜索与回溯算法之红与黑
- C++搜索与回溯算法之单词接龙
- C++搜索与回溯算法之跳棋的挑战
- C++搜索与回溯算法之选数
- C++搜索与回溯算法之八皇后问题
- C++搜索与回溯算法之拆数
- C++搜索与回溯算法之棋盘问题
- [置顶] 信息学奥赛一本通(C++版) 第二部分 基础算法 第五章 搜索与回溯算法
- C++搜索与回溯算法之LETTERS(字母)
- C++搜索与回溯算法之马拦过河卒
- C++搜索与回溯算法之素数环问题
- C++搜索与回溯算法之马走日(遍历问题)
- C++ 实现搜索子串KMP 算法
- 【2016普及组模拟考试】05 搜索 cow(母亲的牛奶)
- c++算法之回溯 素数环(一)