状态搜索。类似八数码问题

AC代码

#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=200+5;
int vis[maxn][maxn];//是否访问过该节点
struct node
{
    int fill[3]; //当前状态的水的分布
    int dist;    //当前状态倒水量
    bool operator < (const node &p) const //排序
    {
        return dist>p.dist;
    }
};

int ans[maxn],cup[3];  

void update_ans(node &u) //细节处理 难点
{
    for(int i=0;i<3;++i)
    {
        int d=u.fill[i];
        if(ans[d]<0||u.dist<ans[d]) ans[d]=u.dist;
    }
} 

void bfs(int a,int b,int c,int d)
{
    cup[0]=a,cup[1]=b,cup[2]=c;
    node start;
    start.fill[0]=0,start.fill[1]=0,start.fill[2]=c;
    start.dist=0;
    priority_queue<node>q;
    q.push(start);
    while(!q.empty())
    {
        node u=q.top();  q.pop();
        update_ans(u);
        if(ans[d]>=0) break;

        //尝试从第i个杯子中向第j个倒水
        for(int i=0;i<3;++i)
        for(int j=0;j<3;++j)
        {
            if(i==j) continue;
            if(u.fill[i]==0||u.fill[j]==cup[j]) continue;
            int pour=min(u.fill[i],cup[j]-u.fill[j]);
            node temp;
            memcpy(&temp,&u,sizeof(u));
            temp.dist=u.dist+pour;
            temp.fill[i]-=pour;
            temp.fill[j]+=pour;
            if(!vis[temp.fill[0]][temp.fill[1]])
            {
            q.push(temp);
            vis[temp.fill[0]][temp.fill[1]]=1;
            }
        }
    }
    while(d>=0)
    {
        if(ans[d]>=0)
        {
            printf("%d %d\n",ans[d],d);
            return ;
        }
        --d;
    }
}
int main()
{
    int T,a,b,c,d;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d%d",&a,&b,&c,&d);
        memset(ans,-1,sizeof(ans));
        memset(vis,0,sizeof(vis));
        bfs(a,b,c,d);
    }
    return 0;
}

如有不当之处欢迎指出!

uva10603 倒水问题的更多相关文章

  1. UVa10603 倒水 Fill-状态空间搜索

    https://vjudge.net/problem/UVA-10603 There are three jugs with a volume of a, b and c liters. (a, b, ...

  2. UVA10603 倒水问题 Fill

    伫倚危楼风细细,望极春愁,黯黯生天际.草色烟光残照里,无言谁会凭阑意. 拟把疏狂图一醉,对酒当歌,强乐还无味.衣带渐宽终不悔,为伊消得人憔悴.--柳永 题目:倒水问题 网址:https://onlin ...

  3. 关于BFS和dijkstra(2019.04.20)

    我的BFS板子 struct node{/*略*/};//表示一个状态 std::map<node,bool>vis;//判断每个状态是否已访问过 std::queue<node&g ...

  4. UVa 10603 倒水问题

    https://vjudge.net/problem/UVA-10603 题意:三个杯子,倒水问题.找出最少倒水量. 思路:路径寻找问题.不难,暴力枚举. #include<iostream&g ...

  5. 广度优先搜索 cdoevs 1226 倒水问题

    cdoevs 1226 倒水问题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升 ...

  6. 倒水问题 (codevs 1226) 题解

    [问题描述] 有两个无刻度标志的水壶,分别可装x升和y升 ( x,y 为整数且均不大于100)的水.设另有一水缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水也可以相互倾倒.已知x升壶为空壶, ...

  7. UVa10603 Fill

    解题思路:这是神奇的一题,一定要好好体会.见代码: #include<cstdio> #include<cstring> #include<algorithm> # ...

  8. 【UVA10603】Fill (构图+最短路)

    题目: Sample Input22 3 4 296 97 199 62Sample Output2 29859 62 题意: 有三个杯子它们的容量分别是a,b,c, 并且初始状态下第一个和第二个是空 ...

  9. POJ 3414 Pots【bfs模拟倒水问题】

    链接: http://poj.org/problem?id=3414 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22009#probl ...

随机推荐

  1. The POM for * is invalid

    The POM for yanan:jar:1.0-SNAPSHOT is invalid, transitive dependencies (if any) will not be availabl ...

  2. Mybatis集成到spring boot

    1, Mybatis简介 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可 ...

  3. 【转】12 TOP Command Examples in Linux

    12个top命令 1. # top 2. # top,后输入shift+O,在“Current Sort Field:”中选左边的field对应的字母进行排序. 3. # top -u tecmint ...

  4. docker基础及安装

    Docker介绍: Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制 ...

  5. diff和patch命令(1)

    1. diff是对两个集合的差运算,patch是对两个集合的和运算. 2. diff以逐行的方式,比较文本文件的异同处.所是指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录 ...

  6. python 字典操作方法详解

    字典是一种通过名字或者关键字引用的得数据结构,key 类型需要时被哈希,其键可以是数字.字符串.元组,这种结构类型也称之为映射.字典类型是Python中唯一內建的映射类型. 注意,浮点数比较很不精确, ...

  7. CSS选择器的组合选择器之后代选择器和子元素选择器

    实例代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF ...

  8. Vsftp的PASV mode和Port模式配置文件的设置

    FTP模式与数据端口 FTP 分为两类,PORT FTP和PASV FTP,PORT FTP是一般形式的FTP.这两种FTP在建立控制连接时操作是一样的,都是由客户端首先和FTP服务器的控制端口(默认 ...

  9. BZOJ 3168: [Heoi2013]钙铁锌硒维生素 [线性基 Hungary 矩阵求逆]

    3168: [Heoi2013]钙铁锌硒维生素 题意:给一个线性无关组A,再给一个B,要为A中每个向量在B中选一个可以代替的向量,替换后仍然线性无关.判断可行和求字典序最小的解 PoPoQQQ orz ...

  10. new function

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...