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

智能推荐

hinkPad T510系列主要机型对比_weixin_34001430的博客-程序员秘密

本表简单易懂,主要针对打算购买TP的用户本文转自 李晨光 51CTO博客,原文链接:http://blog.51cto.com/chenguang/416590,如需转载请自行联系原作者 ...

记一次生产环境Java服务synchronized死锁的处理过程_现实、太残忍的博客-程序员秘密

案例客户反馈网址响应太慢,有时直接无响应。仿佛卡死一般。驱动包:mysql-connector-java 5.1.32过程看的第一眼,感觉这个问题简单。响应慢,肯定是系统在进行full gc STW导致系统变慢。内存泄漏呗!1、查看java服务的堆栈情况使用阿里arthas工具查看,执行dashboard命令看样子不是在full gc,老年代虽说占用了80%,但是还不足以频繁full gc。2、随后查看tomcat日志tomcat启动增加了-ver..

利用阿里云拉取墙外镜像_jacksonary的博客-程序员秘密

利用阿里云拉取墙外镜像 K8S很多镜像都是国内无法拉取的,利用阿里的镜像仓库可以很容易拉取这些镜像,我的方式如下:1.创建存放Dockerfile的仓库 很简单,直接创建一个仓库用于存放Dockerfile的仓库,比如我的docker-ali-autobuild,经过不断摸索,建议文件结构采用如下方式(即 image-name -&gt; version -&gt; Dockerfile)比...

考试座位号 (15分) PTA(C语言)_座位安排(15分)pta_复习你给的温柔的博客-程序员秘密

C语言 考试座位号 (15分) PTA每个 PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。输入格式:输入第一行给出一个正整数 N(≤1000),随后 N 行,每行给出一个考生的信息:准考证号 试机座位号 考试座位号。其中准考证号由 16 位数字

DBUtils框架的使用(上)_.caixukun的博客-程序员秘密

昨天做了这么多的铺垫,当然就是为了引出今天的DBUtils框架了,它的实现原理跟我们编写的简易框架是类似的。话不多说,进入正题。commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首...

海豚php如何安装,模块配置-海豚PHP1.0.6完全开发手册-基于ThinkPHP5.0.10的快速开发框架..._美可琼杰的博客-程序员秘密

一个完整强大的模块,肯定会有许许多多可以自定义的配置,下面我们来详细讲解模块配置信息的各项参数。我们知道,模块配置信息文件info.php是返回一个数组,里面包含了关于模块的各项信息。参数含义类型必填name模块名string是title模块标题string是identifier模块唯一标识string是icon字体图标string否description模块描述string是author开发者s...

随便推点

c --- 参数解析_argp_parse_谛听-的博客-程序员秘密

例子一原文:https://www.gnu.org/software/libc/manual/html_node/Argp-Example-1.html#Argp-Example-1argp 最小的例子。当有参数时,给出一条错误消息。当指定选项“-- help”时,打印消息。#include &lt;stdlib.h&gt;#include &lt;argp.h&gt;int...

C语言:error: a label can only be part of a statement and a declaration is not a statement|_孔天逸的博客-程序员秘密

场景还原一个简单的switch语句Demo#include<stdio.h>int main(){ int a=1, b=2, re; char c; scanf("%c", &c); switch(c) { case '+': re = a + b; break; case '$': re = a - b; r

微信小程序中换行,空格(多个空格)写法_djy252的博客-程序员秘密

在小程序中HTML的网页实体无法正常使用,小程序中的写法为: 一、空格,换行&amp;lt;text&amp;gt;你好!\t七月流火啊!\n我在下一行&amp;lt;/text&amp;gt;1\t 空格( 多个只会显示一个空格) \n 换行二、连续空格&amp;lt;view&amp;gt;    &amp;lt;text space=&quot;ensp&quot;&amp;gt;你好 啊      哈哈哈(空格是中文字符一半大小)&amp;lt;/tex...

最新:斐讯K3千兆无线路由器刷官改版固件的详细图文教程_k3官改_迷影毅的博客-程序员秘密

最新:斐讯K3千兆无线路由器刷官改版固件的详细图文教程2018年1月31日更新:本教程已经同步增添Phitools 作者最新修改的固件以便支持 K3_V21.6.11.58 版刷机。如果喜欢折腾的话可以刷LEDE固件,刷机方法看:[图文教程] 斐讯K3金/银色版路由器免拆机通用刷机教程此前蓝点网已经发布了借助恩山论坛开发者制作的Telnet开启工具刷诸如LEDE以及梅林固件的详细图文教程。不过此前...

web前端ifream详解_雷森图米的博客-程序员秘密

iframe基本内涵通常我们使用iframe直接直接在页面嵌套iframe标签指定src就可以了。&amp;lt;iframe src=&quot;demo_iframe_sandbox.htm&quot;&amp;gt;&amp;lt;/iframe&amp;gt;但是,有追求的我们,并不是想要这么low的iframe. 我们来看看在iframe中还可以设置些什么属性iframe常用属性:1.frameborder:是否...

Spark:Spark SQL、Spark Streaming_あずにゃん的博客-程序员秘密

日萌社人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)spark 入门课程目标:了解spark概念 知道spark的特点(与hadoop对比) 独立实现spark local模式的启动1.1 spark概述 1、什么是spark 基于内存的计算引擎,它的计算速度非常快。但是仅仅只涉及到数据的计算,并没有涉及到数据的存储。 2、为什么要学习spark MapReduce框架局限性.

推荐文章

热门文章

相关标签