题意:

  题目的意思是倒水,给出的四个数据是第一个水杯,第二个水杯,第三个水杯,和目标水量。一开始只有第三个水杯是满的,剩下的水杯是空的。倒水的时候只能把倒水出来的这个杯子倒空,或是倒水进去的杯子倒满。 问最少转移多少水量,使三个杯子中(其中一个)出现目标水量。如果无法出现目标水量,就目标水量减一,还无法出现再减一。

分析:

  bfs不需要退出条件,应该搜到所要状态都访问过为止。每得出一个新状态了,这时候这个状态下达到这三种水量的总倒水量,就是这个状态的里面累加上来的倒水量,如果小于之前记录的达到这三种水量的最小倒水量,就替换,当然如果这个水量是没有出现过的,就直接替换。到最后我们得到一个ans数组(前面说到的达到某种水量的最小倒水量)。初始目标水量是d那我们就先看ans[d] 如果是-1 ,说明从没出现过那就ans[d-1]直到出现不是-1的,就把最小倒水量值输出来,也把下标(这时的目标水量):

代码:

  1.   
  1. #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <queue>
    using namespace std;
    struct node
    {
    int v[3];
    int dist;
    bool operator <(const node& a) const
    {
    return dist>a.dist;
    }
    };
    const int maxn=205;
    int vis[maxn][maxn],cap[3],ans[maxn];
    void solve(int a,int b,int c,int d)
    {
    memset(vis,0,sizeof(vis));
    memset(ans,-1,sizeof(ans));
    cap[0]=a;
    cap[1]=b;
    cap[2]=c;
    priority_queue<node>q;
    node start;
    start.v[0]=start.v[1]=0;
    start.v[2]=c;
    start.dist=0;
    q.push(start);
    vis[0][0]=1;
    while(!q.empty())
    {
  1. node u=q.top();
    q.pop();
    int i,j,k;
    for(i=0;i<3;i++)
    {
    int d1=u.v[i];
    if(ans[d1]<0||u.dist<ans[d1])
    ans[d1]=u.dist;
    //cout<<ans[d]<<endl;
    }
  1. if(ans[d]>=0)
    break;
    for(i=0;i<3;i++)
    {
    for(j=0;j<3;j++)
    {
    if(i!=j)
    {
    //cout<<ans[d]<<endl;
    if(u.v[i]==0||u.v[j]==cap[j])
    continue;
    int amount=min(cap[j],u.v[i]+u.v[j])-u.v[j];
    node u2;
    memcpy(&u2,&u,sizeof(u));
    u2.dist=u.dist+amount;
    u2.v[i]-=amount;
    u2.v[j]+=amount;
    if(!vis[u2.v[0]][u2.v[1]])
    {
    vis[u2.v[0]][u2.v[1]]=1;
    q.push(u2);
    }
    }
    }
    }
    }
    while(d>=0)
    {
    //cout<<ans[d]<<endl;
    if(ans[d]>=0)
    {
    printf("%d %d\n",ans[d],d);
    return;
    }
    d--;
    }
    }
    int main()
    {
    int t;
    scanf("%d",&t);
    while(t--)
    {
    int a,b,c,d;
    scanf("%d%d%d%d",&a,&b,&c,&d);
    solve(a,b,c,d);
    }
    }

UVA 10603 Fill的更多相关文章

  1. UVa 10603 Fill [暴力枚举、路径搜索]

    10603 Fill There are three jugs with a volume of a, b and c liters. (a, b, and c are positive intege ...

  2. UVA 10603 Fill(正确代码尽管非常搓,网上很多代码都不能AC)

    题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=1544">click here~ ...

  3. UVA 10603 - Fill BFS~

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&c ...

  4. 【路径寻找问题】UVa 10603 - Fill

    如家大神书上的例题.第一次接触也是按代码敲得.敲的过程感觉很直观.但自己写估计会写的乱七八糟.以后不能砍得难就不愿意做这种题.否则只能做一些水题了.(PS:48) 紫书 #include<ios ...

  5. UVa 10603 Fill (暴力BFS+优先队列)

    题意:给定4个数,a,b,c,d,分别代表空杯子容积为a,b,一个盛满水的杯子容积为c,让你不断倒水,找一个dd,是不是存在某个时刻, 某个杯子里的水dd,和d相同,或者无限接近.让求最少的倒水量和d ...

  6. UVA - 10603 Fill(隐式图搜索)

    题目大意:经典的倒水问题. 给你三个瓶子,体积为a,b,c. 刚開始a.b是空的,c是满的,如今要求你到出体积为d的水.倒水的规则为,要么倒水方为空,要么接水方满 问倒到容量为d时,倒水的最小体积是多 ...

  7. UVA - 10603 Fill(BFS求最小值问题)

    题目: 给出三个杯子(没有刻度线)的容量,起初之后第三个杯子是满的,其他的两个杯子是空的,容量分别是a.b.c.问最少需要倒多少升水才能让某一个杯子中的水有d升?如果不能恰好做到d升,就让某一个杯子里 ...

  8. UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)

    题意 : 有装满水的6升的杯子.空的3升杯子和1升杯子,3个杯子中都没有刻度.不使用道具情况下,是否可量出4升水呢? 你的任务是解决一般性的问题:设3个杯子的容量分别为a, b, c,最初只有第3个杯 ...

  9. 倒水问题(Fill,UVA 10603) lrj白书 p202

    看着lrj的代码自己敲了一遍,还没调试成功.... 有时间再进行完善 /* 状态start到各个状态u1,u2,u3..... 的倒水量分别为u1.dist,u2.dist,u3.dist.... * ...

随机推荐

  1. Swift的基础,操作符,字符串和集合类型

    这篇文章主要讲解苹果Swift官方指南的第二章前四节的要点内容,如果想看完整的英文文档可以去苹果开发者页面下载. Basic 声明常量let 声明变量var 注释依旧使用"//" ...

  2. jdbc——CallableStatement,cst调用存储过程

    package CST对象调用存储过程; import java.sql.CallableStatement; import java.sql.Types; import org.junit.Test ...

  3. typedef和define的作用域

    typedef: 如果放在所有函数之外,它的作用域就是从它定义开始直到文件尾: 如果放在某个函数内,定义域就是从定义开始直到该函数结尾: #define: 不管是在某个函数内,还是在所有函数之外,作用 ...

  4. CSS圆角样式

    CSS圆角: /*纯css,设置图片圆角*/ #top2 { margin-left:20px; padding:10px; width:600px; height:300px; border: 5p ...

  5. PHP截取汉字乱码问题解决方法mb_substr函数的应用

    首先 1.确保你的Windows/system32下有php_mbstring.dll这个文件,没有就从你Php安装目录extensions里拷入Windows/system32里面. 2.在wind ...

  6. java.io.IOException: open failed: ENOENT (No such file or directory)open failed: EISDIR (Is a directory)

    这一类的错误,原因一般有两点: 1.没有给相应读写文件权限 2.给了权限,但是文件的路径写的不对,比如少了“/”,这样就会报错了. Caused by: android.system.ErrnoExc ...

  7. C++有没有string转化int的函数,怎样转换

    有两种方法1. c++中string到int的转换 1) 在C标准库里面,使用atoi: #include <cstdlib>#include <string> std::st ...

  8. Oracle EBS-SQL (BOM-18):检查BOM与工艺路线对照.sql

    /*有工艺路线,无BOM清单*/ select msi.segment1, msi.description from apps.BOM_OPERATIONAL_ROUTINGS bor, apps.m ...

  9. 【Xamarin挖墙脚系列:Xamarin正式发布了IOS的模拟器在Windows下】

    xamarin 的发展越来越迅速.如果还感觉这玩意儿是个鸡肋,辣么请跟的上时代吧 . (额,对微软产品有严重偏见的请绕行..............其实你可以看看.net 基金会现有的开源项目再说不开 ...

  10. CSS美化页面滚动条

    文章来自:http://www.webhek.com/scrollbar 本文将会告诉你如何用CSS修改/美化浏览器页面上出现的滚动条.改变它们的颜色,调整它们的外形,适配你对页面UI设计.我们首先将 ...