uva 10603 - Fill

简介: 点击打开链接 题目所属:  隐式图的搜索 题目意思:  有三个容器大小为 a b  c 刚开始 a b都是空的 c是满的,现在给定一个d 大小的水量 ,要求我么找到最小的倒水总量使得有一个容器的水量为 d,如果找不到那么就用d'代替d(d' < d)直到能够找到有一个容器的水量为 d为止,最后输出 最小的倒水总量和 d' 解题思路:   倒水条件:假设是a倒入b中,那么必须要有a被倒空或 b 被倒满。

点击打开链接


题目所属:  隐式图的搜索


题目意思:  有三个容器大小为 a b  c 刚开始 a b都是空的 c是满的,现在给定一个d 大小的水量 ,要求我么找到最小的倒水总量使得有一个容器的水量为 d,如果找不到那么就用d'代替d(d' < d)直到能够找到有一个容器的水量为 d为止,最后输出 最小的倒水总量和 d'


解题思路:   倒水条件:假设是a倒入b中,那么必须要有a被倒空或 b 被倒满。
                    经典的倒水问题,只是结果是要我们输出最小的倒水总量而不是次数,这个需要注意。我们知道对于三个容器而言,里面就是水装的多不多,那么我么就知道这个容器的状态就是水的多少,那么开始的状态就是(0 , 0 , c),我们还知道如果容器a有水那么它可以选择倒到b 和 c ,其它类似。那么这个解空间树就是一个多叉树,我们就可以通过BFS进行搜索,搜索每一状态,那么我么只要开一个结构体里面放三个容器的水量和当前状态的最小倒水总量,那么只要找到有一个容器的水量为d,那么我们就可以去更新ans(判断ans是否大于当前的minsum)。如果没办法倒出d的水量,那么我么就用一个循环往下搜索直到找到d'。最后输出ans  和 d 


代码:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <cstdio>
#include <stack>
#include <queue>
using namespace std;
#define MAXN  210

int t , ans;
int vis[MAXN][MAXN][MAXN];//标记状态是否出现过
int jugs[3] , d;
struct Node{//结构体存储三个容器的水量和当前状态的最小倒水总量
    int v[3];
    int minsum;
};
queue<Node>q;

void Bfs(){
    while(!q.empty())
        q.pop();
    memset(vis , 0 , sizeof(vis));
    ans = 999999999;//初始化为无穷大
    vis[0][0][jugs[2]] = 1; //初始状态
    Node tmp;
    tmp.v[0] = 0;
    tmp.v[1] = 0;
    tmp.v[2] = jugs[2];
    tmp.minsum = 0;
    q.push(tmp);//第一个状态先入对列
    while(!q.empty()){
        Node tmp = q.front();
        q.pop();
        for(int i = 0 ; i < 3 ; i++){//枚举三个容器
            if(tmp.v[i] == d){//只要有一个容器的水量为d就判断并且跳出该次的循环
                if(ans > tmp.minsum)
                    ans = tmp.minsum;
                break;
            }
            else{ 
                for(int j = 0 ; j < 3 ; j++){//这个就是去判断容器v[i]能不能够倒水到v[j]。
                    if(i != j){//倒水前提是不同一个容器
                        Node Tmp = tmp;
                        if(tmp.v[i] && jugs[j] - tmp.v[j]){//如果v[i]有水并且v[j]有剩余的空间可以存水才满足
                            int min = tmp.v[i] < jugs[j] - tmp.v[j] ? tmp.v[i] : jugs[j] - tmp.v[j];//找到两者中的最小这样才能满足倒水的条件
                            Tmp.minsum += min;//当前倒水量加上min
                            Tmp.v[i] -= min;//容器相应减少水量
                            Tmp.v[j] += min;//容器相应减少水量
                            if(!vis[Tmp.v[0]][Tmp.v[1]][Tmp.v[2]]){//如果这个状态没出现过才push进队列
                                vis[Tmp.v[0]][Tmp.v[1]][Tmp.v[2]] = 1;
                                q.push(Tmp);
                            }
                        }
                    }
                }
            }
        }
    }
}

int main(){
    scanf("%d" , &t);
    while(t--){
        scanf("%d%d%d%d" , &jugs[0] , &jugs[1] , &jugs[2] , &d);
        Bfs();
        if(ans == 999999999){////如果需要继续Bfs
            while(1){
                    d--;//向下搜索
                    Bfs();
                    if(ans != 999999999) break;//只要找到满足就退出
            }
        }
        printf("%d %d\n" , ans , d);//最后输出结果
    }
    return 0;
}


目录
相关文章
|
程序员
面试高频题:开发人员说不是bug,测试如何答复?
面试高频题:开发人员说不是bug,测试如何答复?
447 0
|
存储 Java
Java堆和栈的区别和介绍以及JVM的堆和栈
Java堆和栈的区别和介绍以及JVM的堆和栈 一、Java的堆内存和栈内存 Java把内存划分成两种:一种是堆内存,一种是栈内存。 堆:主要用于存储实例化的对象,数组。由JVM动态分配内存空间。一个JVM只有一个堆内存,线程是可以共享数据的。
6329 0
|
SQL 安全 PHP
PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全
本文深入探讨了PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全。
600 4
|
测试技术
测试点和测试用例一样吗?
测试点和测试用例一样吗?
1153 0
|
测试技术 Python
python接口自动化(五)--接口测试用例和接口测试报告模板(详解)
当今社会在测试领域,接口测试已经越来越多的被提及,被重视,而且现在好多招聘信息要对接口测试提出要求。区别于传统意义上的系统级别测试,很多测试人员在接触到接口测试的时候,也许对测试执行还可以比较顺利的上手,但一 提到相关的文档,比如测试用例和报告,就有些不知所措了。这类问题在我加入的几个测试的群里,经常看到一些人在不断提问。   今天就用这篇文章来说说接口测试用例和报告。
720 2
python接口自动化(五)--接口测试用例和接口测试报告模板(详解)
|
存储 JSON 数据格式
postman如何做接口关联
postman如何做接口关联
613 0
|
搜索推荐 算法 C++
c++排序算法——冒泡排序(不会的一定要看,超级详细)
c++排序算法——冒泡排序(不会的一定要看,超级详细)
3284 0
|
存储 JavaScript 安全
跨站脚本攻击(XSS)和跨站请求伪造(CSRF)是什么?区别是什么?底层原理是什么?
跨站脚本攻击(XSS)和跨站请求伪造(CSRF)是什么?区别是什么?底层原理是什么?
1410 0
Java 最常见的面试题:== 和 equals 的区别是什么
Java 最常见的面试题:== 和 equals 的区别是什么
1624 0
|
存储 缓存 前端开发
“你的网站加载速度很慢怎么办?”——技术经理在面试中可能遇到的可怕问题
“你的网站加载速度很慢怎么办?”——技术经理在面试中可能遇到的可怕问题
374 0