USACO 1.4 Mother's Milk

解题思路
较为经典的搜索,状态为A,B,C中的量,初始为(0,0,C),有六种状态转移方式,用递归即可完成所有方案;

解题要点
1.递归函数,三个变量分别为A中的量 a , B中的量 b ,C中的量 c 。六种转移方式(c->a , c->b, a->b, a->c, b->a, b->c),如果满足条件则进行递归,如果a为0,则找到一组解,记录下来(最后要排序输出)。

void dg(int a,int b,int c)
{
    if(a==0)
    {
        cont++;
        ans[cont]=c;
    }
    if(c>0)
    {
        if(a<A)
        {
            int cc=c,aa=a;
            pull(cc,aa,A);
            if(book[aa][b][cc]==0)
            {
                book[aa][b][cc]=1;
                dg(aa,b,cc);
            }
        }
        if(b<B)
        {
            int cc=c,bb=b;
            pull(cc,bb,B);
            if(book[a][bb][cc]==0)
            {
                book[a][bb][cc]=1;
                dg(a,bb,cc);

            }
        }
    }
        if(a>0)
    {
        if(c<C)
        {
            int cc=c,aa=a;
            pull(aa,cc,C);
            if(book[aa][b][cc]==0)
            {
                book[aa][b][cc]=1;
                dg(aa,b,cc);

            }
        }
        if(b<B)
        {
            int aa=a,bb=b;
            pull(aa,bb,B);
            if(book[aa][bb][c]==0)
            {
                book[aa][bb][c]=1;
                dg(aa,bb,c);

            }
        }
    }
        if(b>0)
    {
        if(a<A)
        {
            int bb=b,aa=a;
            pull(bb,aa,A);
            if(book[aa][bb][c]==0)
            {
                book[aa][bb][c]=1;
                dg(aa,bb,c);

            }
        }
        if(c<C)
        {
            int cc=c,bb=b;
            pull(bb,cc,C);
            if(book[a][bb][cc]==0)
            {
                book[a][bb][cc]=1;
                dg(a,bb,cc);

            }
        }
    }
    return ;
}

3.倾倒的操作,可以用引用操作,自己写一个函数来完成

void pull(int& x,int& y,int& Y)
{
    int k=Y-y;
    if(k>x)
    {
        y=y+x;
        x=0;
        return ;
    }
    y=Y;
    x=x-k;
    return;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值