三个水杯(BFS)

三个水杯
时间限制:1000 ms | 内存限制:65535 KB
难度:4
描述
给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。
输入
第一行一个整数N(0

/*
    广搜
    六个方向
    a - > b
    b - > a
    c - > a
    a - > c
    b - > c
    c - > b
http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=21
*/

#include<iostream>
#include<stdio.h>
#include<queue>
#include<string.h>

using namespace std;
struct LNode
{
    int v1,v2,v3;
    int step;
    LNode()
    {
        step = 0;
    }
};
int e1,e2,e3;
int v1,v2,v3;
int vis[107][107][107];//表示状态
int bfs()
{
    LNode node;
    node.v1 = v1;
    node.v2 = 0;
    node.v3 = 0;
    node.step = 0;
    queue<LNode> Q;
    Q.push(node);
    while(!Q.empty())
    {
        LNode now = Q.front();
        vis[now.v1][now.v2][now.v3] = 1;
        Q.pop();
        if(now.v1 == e1 && now.v2 == e2 && now.v3 == e3)
            return now.step;
        if(now.v1 > 0)
        {
            // a->b
            if(now.v2 < v2)
            {
                int tmp ;
                if(now.v1 >= (v2 - now.v2))
                    tmp = (v2 - now.v2);
                else
                    tmp = now.v1;
                LNode next = now;
                next.step ++;
                next.v1 -= tmp;
                next.v2 += tmp;
                if(!vis[next.v1][next.v2][next.v3])
                {
                    Q.push(next);
                    vis[next.v1][next.v2][next.v3] = 1;
                }
             }
             // a- > c
             if(now.v3 < v3)
             {
                int tmp ;
                if(now.v1 >= (v3 - now.v3))
                    tmp = (v3 - now.v3);
                else
                    tmp = now.v1;
                LNode next = now;
                next.step ++;
                next.v1 -= tmp;
                next.v3 += tmp;
                if(!vis[next.v1][next.v2][next.v3])
                {
                    Q.push(next);
                    vis[next.v1][next.v2][next.v3] = 1;
                }
             }
        }
        if(now.v2 > 0)
        {
            //b - > a
            if(now.v1 < v1)
            {
                 int tmp ;
                if(now.v2 >= (v1 - now.v1))
                    tmp = (v1 - now.v1);
                else
                    tmp = now.v2;
                LNode next = now;
                next.step ++;
                next.v1 += tmp;
                next.v2 -= tmp;
                if(!vis[next.v1][next.v2][next.v3])
                {
                    Q.push(next);
                    vis[next.v1][next.v2][next.v3] = 1;
                }
            }
            //b- > c
            if(now.v3 < v3)
            {
                 int tmp ;
                if(now.v2 >= (v3 - now.v3))
                    tmp = (v3 - now.v3);
                else
                    tmp = now.v2;
                LNode next = now;
                next.step ++;
                next.v3 += tmp;
                next.v2 -= tmp;
                if(!vis[next.v1][next.v2][next.v3])
                {
                    Q.push(next);
                    vis[next.v1][next.v2][next.v3] = 1;
                }
            }
        }
        if(now.v3 > 0)
        {
            //c - > a
            if(now.v1 < v1)
            {
                int tmp ;
                if(now.v3 >= (v1 - now.v1))
                    tmp = (v1 - now.v1);
                else
                    tmp = now.v3;
                LNode next = now;
                next.step ++;
                next.v3 -= tmp;
                next.v1 += tmp;
                if(!vis[next.v1][next.v2][next.v3])
                {
                    Q.push(next);
                    vis[next.v1][next.v2][next.v3] = 1;
                }
            }
            //c - > b
             if(now.v2 < v2)
            {
                int tmp ;
                if(now.v3 >= (v2 - now.v2))
                    tmp = (v2 - now.v2);
                else
                    tmp = now.v3;
                LNode next = now;
                next.step ++;
                next.v3 -= tmp;
                next.v2 += tmp;
                if(!vis[next.v1][next.v2][next.v3])
                {
                    Q.push(next);
                    vis[next.v1][next.v2][next.v3] = 1;
                }
            }
        }
    }
    return -1;
}
int main()
{
    int ncase;
    cin>>ncase;
    while(ncase--)
    {
        cin>>v1>>v2>>v3;
        cin>>e1>>e2>>e3;
        memset(vis,0,sizeof(vis));
        int num = bfs();
        cout<<num<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值