最近在练习搜索,所以更新的内容大部分都是有关DFS、BFS的练习题
Resource:
Problem:
三个牛奶桶A,B,C,其中只有C中开始装满牛奶,你可以任意选择将某桶奶倒入其他奶桶,只能倒完或者让另一桶装满,问在A为空的时候,C有多少种情况?
Ideas:
- 总共的情况是有 a ∗ b ∗ c a*b*c a∗b∗c种,最大是 20 ∗ 20 ∗ 20 20*20*20 20∗20∗20种情况,暴力搜索可行
- 有以下六种操作: a a a-> b b b, a a a-> c c c, b b b-> a a a, b b b-> c c c, c c c-> a a a, c c c-> b b b
- 每种操作分为(以 a a a-> b b b为例): a a a桶空 or b b b桶满两种情况
AC Code:
#include<bits/stdc++.h>
using namespace std;
const int N=25;
int va,vb,vc; //初始容积
bool vis[N][N][N]; //记录表
void dfs(int a,int b,int c)
{
//a,b,c分别代表目前三个桶中的牛奶的量
if(vis[a][b][c]) return;
vis[a][b][c]=true;
//6种情况,a->b,a->c,b->a,b->c,c->a,c->b 直到被倒入牛奶的桶满了或者倒出牛奶的桶空了为止。
//a->b a空 or b满
if(vb-b>a) dfs(0,b+a,c);//a空
if(vb-b<=a) dfs(a-(vb-b),vb,c);//b满
//a->c a空 or c满
if(vc-c>a) dfs(0,b,c+a);//a空
if(vc-c<=a) dfs(a-(vc-c),b,vc); //c满
//b->a b空or a满
if(va - a > b) dfs(a + b, 0, c);//b 空
if(va - a <= b) dfs(va, b - (va - a), c); //a满
// b->c
if(vc - c > b) dfs(a, 0, c + b); //b空
if(vc - c <= b) dfs(a, b - (vc - c), vc);//c满
// c->a
if(va - a > c) dfs(a + c, b, 0);// 1、 c 空
if(va - a <= c) dfs(va, b, c - (va - a));// 2、 a 满
// c->b
if(vb - b > c) dfs(a, b + c, 0);//c空
if(vb - b <= c) dfs(a, vb, c - (vb - b));//b满
}
int main()
{
scanf("%d%d%d",&va,&vb,&vc);
dfs(0,0,vc); //刚开始是 a b空 c满
for(int i=0;i<=vc;i++)
{
for(int j=0;j<=vb;j++)
{
if(vis[0][j][i]) printf("%d ",i); //找到a空时 c的奶量
}
}
return 0;
}
Motto of the day:
勤奋可立身,败由惰中生。
复更后稍感疲惫,来点句子激励下自己