NYOJ-21三个水杯(BFS 广度优先搜索)_痞子丐的博客-程序员秘密

技术标签: C++  acm  

三个水杯

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 4
描述
给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。
输入
第一行一个整数N(0<N<50)表示N组测试数据
接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的体积。
第二行给出三个整数E1 E2 E3 (体积小于等于相应水杯体积)表示我们需要的最终状态
输出
每行输出相应测试数据最少的倒水次数。如果达不到目标状态输出-1
样例输入
2
6 3 1
4 1 1
9 3 2
7 1 1
样例输出
3

-1


典型的BFS(广度优先搜索)

每次倒水 有6种情况:

水杯A、B、C

A->B

A -->C

B-->A

B-->C

C-->A

C-->B


按BFS思想构造 求目标的 深度即最少倒水次数

//
//  main.cpp
//  NYOJ-21 三个水杯
//  BFS  广度优先搜索
//  Created by [email protected] on 14-7-22.
//  Copyright (c) 2014年 Hzw. All rights reserved.
//


#include<iostream>
#include <queue>
#include <vector>
#include "string.h"
#include <algorithm>


using namespace std;
int cupCapacity[3],targetState[3];

class CupState
{
public:
    int iState[3];
    int iStep;
};


bool operator== ( const CupState  &data1, const CupState &data2)
{
    if( data1.iState[0]== data2.iState[0]
       && data1.iState[1] == data2.iState[1]
       && data1.iState[2] == data2.iState[2])
        return true;
    else
        return  false;
}

vector<CupState> visitBuf;

int pourWater(int sourceId,int targetId,CupState WaterState,queue<CupState> &qCupState)
{
    if(WaterState.iState[0] == targetState[0]
       && WaterState.iState[1] == targetState[1]
       && WaterState.iState[2] == targetState[2])
        return WaterState.iStep;
    
    if (sourceId == targetId ||
        WaterState.iState[sourceId] == 0
        || WaterState.iState[targetId] == cupCapacity[targetId]) {
        return -1;
    }
    if (cupCapacity[targetId] - WaterState.iState[targetId] >= WaterState.iState[sourceId]) {
        WaterState.iState[targetId] += WaterState.iState[sourceId];
        WaterState.iState[sourceId] = 0;
    }
    else
    {
        WaterState.iState[sourceId] -= (cupCapacity[targetId] - WaterState.iState[targetId]);
        WaterState.iState[targetId] = cupCapacity[targetId];
    }
    WaterState.iStep++;
    if(WaterState.iState[0] == targetState[0]
       && WaterState.iState[1] == targetState[1]
       && WaterState.iState[2] == targetState[2])
        return WaterState.iStep;
    if(find(visitBuf.begin(), visitBuf.end(), WaterState) ==visitBuf.end())
    {
        qCupState.push(WaterState);
        visitBuf.push_back(WaterState);
    }
    return -1;
}

int fBFS()
{
    CupState beginState, stateTemp;
    memset(&beginState, 0, sizeof(beginState));
    memset(&stateTemp, 0, sizeof(stateTemp));
    beginState.iState[0] = cupCapacity[0];
    queue<CupState> qCupState;
    qCupState.push(beginState);
    visitBuf.push_back(beginState);
    while (!qCupState.empty()) {
        CupState data = qCupState.front();
        qCupState.pop();
        for(int i=0;i<3;i++)
            for(int j=0;j<3;j++)
            {
                int iRet = pourWater(i, j, data,qCupState);
                if (iRet != -1) {
                    return iRet;
                }
            }
    }
    return -1;
};

int main()
{
    int M;
	cin>>M;
    while (M--) {
        visitBuf.clear();
        cin >> cupCapacity[0] >> cupCapacity[1] >> cupCapacity[2];
        cin >> targetState[0] >> targetState[1] >> targetState[2];
        cout << fBFS() << endl;
    }
    return 0;
}



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hong3088/article/details/38054409

智能推荐

说说java.text.DecimalFormat的用法_hnwangdan的博客-程序员秘密

搞客户端开发的,服务端返回过来得数据信息,要求进行特别处理,最近就碰到过类似情况,虽然查找API 和网络资料,有多种处理方法:但是个人经验认为 一下的方法最简洁、最高效:     首先在项目中引入 包:java.text.DecimalFormat;     然后:               DecimalFormat nf = new DecimalFormat("0.00")

。_蓝牙空口包抓取_weixin_42083124的博客-程序员秘密

BLE抓包分析BLE抓包软件Frontline ComProbe Analysis SystemWireshark合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入BLE抓包软件BLE抓包软件用得比较多的有Frontline ComProb

Zemax中序列模式与非序列模式的区别_zemax序列和非序列差别_HECHUANWANG的博客-程序员秘密

一、Zemax光学设计超级手册中介绍如下:在zemax序列模型中,所有光线传播发生在特定局部坐标系中的光学面。在非序列模型中,光学元件都用三维物体来模拟(因为有许多光学元件不能在简单的序列表面中被模拟出来,都需要3D物体模拟),且所有物体放置在一个全局坐标系中。

Mobaxterm使用详解_Jayden yang的博客-程序员秘密

疫情在家使用Mobaxterm远程登录服务器。MobaXterm是一个全功能的终端软件。支持SSH连接,支持FTP、串口等协议。下面是基本使用步骤:单击左上角的”Session”按钮 在弹出框中点击“SSH”选项 在“Remote host”中输入绑定的弹性IP 值 勾选“Specify username”并输入用户名 点击OK,输入password,回车进入控制台如...

js转换页面为图片并下载_js网络地址转为jpg_阿雨*的博客-程序员秘密

js转换页面为图片并下载&lt;div style="background:red;width: 600px;height: 600px;" class="test"&gt; &lt;div id="imgs" style="background:green;"&gt; &lt;div style="background:blue;"&gt; &lt;div style="background:yellow;"&gt; &lt

git上传项目代码到GitHub_覆盖前面推送到git上的前端代码_未来前端程序猿的博客-程序员秘密

1、下载好git以后打开项目所在文件夹 右键 git bash here2、输入$ ssh-keygen -t rsa -C “邮箱地址”3、然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。当然设置密码最好,如果一切顺利的话,可以在用C盘用户目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rs...

随便推点

在Android上可视化TensorFlow Lite AI结果_在android上用ai识别物体_寒冰屋的博客-程序员秘密

在这里,我们完成了基于TensorFlow Lite的应用程序的构建,该应用程序使用来自ONNX Model Zoo的网络模型执行对象识别。输出存储在一组数字数组中。除非我们做更多的工作来解释其中的值,否则数值数组本身不会告诉我们有关检查图像的太多信息。数组的保持值之一如下所示:float[][][][][] buf2 = new float[1][13][13][3][85];让我们解包这个数组。数组的第一个维度是1,用于选择要检查的一组图像中的哪个图像。对于我们的实现,任何时候都只...

关于结构体字节对齐的问题_众里寻佳千百度1995的博客-程序员秘密

第一次写博客,因为据说写博客的都是高手。引用:http://blog.sina.com.cn/s/blog_559f6ffc0101dbem.html正文:__attrubte__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。注意要加这句话:#progma pack(1) 里面的1表示1字节对齐。例子:qt平台...

mybatis plus 各种查询_是楷不是凯的博客-程序员秘密

package com.xiao.permission_system;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.baomidou.mybatisplus.extension.service.additional.query.impl.Lambd

python之面向对象编程-自定义内置方法定制类的功能,元类_bangwu8607的博客-程序员秘密

1.内置方法: __str__ 打印自动触发 __del__ 删除对象之前自动触发2.用于实例化产生类的类称之为元类 __call__ 调用对象时自动触发 __new__ 新建一个空对象 __init__ 调用类自...

22-ForkJoin框架_bLink-m的博客-程序员秘密

Fork/Join框架介绍什么是Fork/Join框架Fork/Join框架是Java7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。我们再通过Fork和Join这两个单词来理解下Fork/Join框架,Fork就是把一个大任务切分为若干子任务并行的执行,Join就是合并这些子任务的执行结果,最后得到这个大任务的结...

推荐文章

热门文章

相关标签