您的位置:首页 > 编程语言 > C语言/C++

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++ 基础 算法 bfs 搜索