uva10603 - Fill

这个题是典型的bfs,,,,

思路不难,就是a,b,c三杯水,互相倒,,,但是有条件,加入a杯要向杯里倒水的话,必须满足一、a杯中有水,二、b杯还未盛满。

这样写下来队列就受不了了。。。。。以为有不断重复的情况,,,,,没一种重复的情况, 底下的所有层的数据都是重复的,要做很多的无用功。。。

因此,我采用的vis[]数组来记录。。已保证程序不再做无用功。。。

代码如下:

#include <cstdio>
#include <cstring>
#define M 1000
int queue[M][3], sum[M], v[3], vis[200][200], goal;
void bfs()
{
    int ok = 0, rear = 0, front = 1;
    queue[0][0] = queue[0][1] = 0; queue[0][2] = v[2]; sum[0] = 0;
    vis[0][0] = 1;
    while(!ok&&front>rear)
    {
        int cup[3], s;
        cup[0] = queue[rear][0], cup[1] = queue[rear][1], cup[2] = queue[rear][2],
        s = sum[rear];
        for(int i = 2; !ok&&i >= 0; i--) for(int j = 2; !ok&&j >= 0; j--) if(i!=j&&cup[i]>0&&cup[j]<v[j])
        {
            if(cup[i]>=v[j]-cup[j])
            {
                sum[front] = s + v[j] - cup[j];
                queue[front][i] = cup[i] - v[j] + cup[j];
                queue[front][j] = v[j];
            }
            else
            {
                sum[front] = s + cup[i];
                queue[front][i] = 0;
                queue[front][j] = cup[j] + cup[i];
            }
            for(int k = 0; k < 3; k++)
                if(k!=i&&k!=j)
                    queue[front][k] = cup[k];
                else if(queue[front][k]==goal)
                    {ok = 1; printf("%d %d\n",sum[front], goal); break;}
            if(!vis[queue[front][0]][queue[front][1]]){ vis[queue[front][0]][queue[front][1]] = 1; front++;}
        }
        rear++;
    }
}
int main ()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        for(int i = 0; i < 3; i++) scanf("%d",&v[i]);
        scanf("%d",&goal);
        memset(vis,0,sizeof(vis));
        bfs();
    }
    return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值