题目

分析:注意这里求的是最少流量, 二不是最少步数!!!所以我们用优先队列去维护一个最小流量,然后进行bfs即可,解释一下一个重要的数组ans[i],表示的是杯子中的水为i时的最小流量

 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "queue"
 5 #include "algorithm"
 6 using namespace std;
 7 const int maxn=200+10;
 8 int a,b,c,d,T;
 9 int vis[maxn][maxn],ans[maxn],cap[3];  //ans[i]表示杯子中有i升水时对应的最少倒水量
10 struct Node{
11     int v[3],dist;
12     bool operator < (const Node & rsh) const{  //小顶堆
13         return dist>rsh.dist;
14     }
15 };
16
17 void update(const Node & u){   //更新ans[]
18     for(int i=0;i<3;i++){
19         int s=u.v[i];
20         if(ans[s]<0||u.dist<ans[s])  ans[s]=u.dist;
21     }
22 }
23
24 void bfs(int a,int b,int c,int d){
25     memset(vis,0,sizeof(vis));
26     memset(ans,-1,sizeof(ans));
27     cap[0]=a,cap[1]=b,cap[2]=c;
28     Node start;
29     start.dist=0;
30     start.v[0]=0,start.v[1]=0,start.v[2]=c;
31     priority_queue<Node>que;
32     vis[0][0]=1;
33     que.push(start);
34     while(!que.empty()){
35         Node u=que.top(); que.pop();
36         update(u);
37         if(ans[d]>=0)  break;   //如果找到了
38         for(int i=0;i<3;i++){
39             for(int j=0;j<3;j++) if(i!=j){   //自己不能和自己匹配
40                 if(u.v[i]==0||u.v[j]==cap[j])   continue;
41                 int num=min(cap[j],u.v[i]+u.v[j])-u.v[j];
42                 Node u2;
43                 memcpy(&u2,&u,sizeof(u));
44                 u2.v[i]-=num;
45                 u2.v[j]+=num;
46                 u2.dist=u.dist+num;
47                 if(!vis[u2.v[0]][u2.v[1]]){  //如果当前状态没有出现过
48                     vis[u2.v[0]][u2.v[1]]=1;
49                     que.push(u2);
50                 }
51             }
52         }
53     }
54     while(d>=0){
55         if(ans[d]>=0){
56             printf("%d %d\n",ans[d],d);
57             return ;
58         }
59         --d;
60     }
61 }
62 int main()
63 {
64     scanf("%d",&T);
65     while(T--){
66         scanf("%d%d%d%d",&a,&b,&c,&d);
67         bfs(a,b,c,d);
68     }
69     return 0;
70 }

View Code

转载于:https://www.cnblogs.com/wolf940509/p/6741074.html

状态空间搜索好题UVA10603相关推荐

  1. 搜索问题之状态空间搜索(状态压缩+记忆化搜索+ BFS)

    文章目录 1. 前言 2. 问题举例(九宫格问题) 3. 问题分析 3.1 状态编码与解码 3.2 哈希映射 3.3 集合判重 4. 问题实现 推荐阅读 1. 前言 之前介绍的回溯法常用于 解空间的搜 ...

  2. 7.搜索求解策略: 搜索的概念, 状态空间搜索, 盲目/启发式图搜索策略, 启发信息和估价函数, A搜索算法, A*搜索算法及特性分析

    本文内容为浙江工业大学王万良慕课课程的课程讲义, 将其整理为OneNote笔记同时添加了本人上课时的课堂笔记, 且主页中的思维导图就是根据课件内容整理而来, 为了方便大家和自己查看,特将此上传到CSD ...

  3. 迷宫问题(寻路)和状态空间搜索

    迷宫问题以及状态空间搜索的实现,有赖于栈和队列这些数据结构的支持. 1. 解迷宫问题 解迷宫问题是一种常见智力游戏,也可以视为许多实际问题的反映和抽象.例如: 在公路网或铁路网上查找可行的或最优的路线 ...

  4. 状态空间搜索或者空间搜索或者迷宫问题总结(递归法、回溯法)Python(递归一般用栈,回溯是循环)

    状态空间搜索问题或者称迷宫问题的基本特征是: 1.存在一集合可能状态(位置.情况等.这一集合可能很大).例:迷宫问题中的可能位置. 2.有一个初始状态S0,一个或者多个结束状态,或者有判断成功结束的方 ...

  5. ACM本周搜索做题小结和心得体会

    这周除了接着看上次没看完剩下的题,主要的就是做题了 我把这周新学到的和以前还没总结过的以及做题心得再主要说一下 这周做题和看到的主要是以下这几类 我把这周做题时遇到的某几类题简单归了一下类然后总结 遍 ...

  6. hdu3786 Floyd或搜索 水题

    题意: 找出直系亲属 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  7. 2018-2-22 《啊哈,算法》再练习广度优先搜索,题:炸怪兽, 2-23改用深度优先搜索。宝岛探险(广度,深度,及地图着色)2-24水管工游戏,2-25测试水管工代码...

    2小时. 先是是纠错,通过对代码运行过程的测试.发现是变量打错.以及录入地图❌. 重构练习题,改使用while..end代替for in. ⚠️ : 在while(k <= n)中如果用到nex ...

  8. UVA10118(记忆化搜索 + 好题)

    http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19440 题意,4堆不同颜色的糖果,每堆N个,从堆上往下拿,放入一个最大装5个 ...

  9. noip搜索模拟题 骰子

    骰子 dice.cpp/c/pas 1s/128M [题目描述] 桌面上有两个特别的骰子.骰子的每一个面,都写了一个不同的数字.设第一个骰子上下左右前后分别为a1, a2, a3, a4, a5, a ...

最新文章

  1. java获取文件的所有者_java获取文件夹下所有文件的名称 | 星尘
  2. 南京大学《物联网技术导论》课程
  3. Mac OS X10.11(OS X EI Capitan)安装程序下载
  4. EF6 在原有数据库中使用 CodeFirst 总复习(四、新建实体对象)
  5. 一文搞定Mysql日期时间函数
  6. why SAP OData default 100 entries are returned
  7. C/C++ 中变量的声明、定义、初始化的区别
  8. php简单分页,php简单实现分页查询的方法
  9. slot多作用域 vue_详解Vue.js 作用域、slot用法(单个slot、具名slot)
  10. Windows 95被做成了一款软件,可玩扫雷和纸牌
  11. java文件写入_java怎么写入文件
  12. JAVA面试--电商业内大厂
  13. Django 模板层
  14. QLineEdit使用正则表达式小剖析
  15. Markdown 标记语言指北
  16. 李航《统计学习方法》多项式函数拟合问题--最小二乘法
  17. Cisco防火墙基础介绍及配置
  18. 解决: 在路径为[/StudentManagerWeb]的上下文中,servlet[LoginServlet]的Servlet.service()引发异常 java.lang.NullPointe
  19. 如何快速查询京东快递物流正在派送中的单号
  20. 关于高通平台下camera一些参数的设置

热门文章

  1. vue props 多类型_一个TypeScript简例,以及Vue支持TS的一些些事儿
  2. 计算机自带的桌面远程,如何远程控制电脑桌面
  3. python制作雷达图_python制作雷达图
  4. 牛客练习-哈尔滨理工大学21级新生程序设计竞赛(同步赛)
  5. Gartner:2015年启动的企业级区块链项目90%会失败,它们犯了这十大常见错误
  6. 远离你的电脑,代码写得更好!
  7. rhcsa第二天笔记
  8. 如何解决arcmap中的反走样问题。
  9. 解决方案: NIS+NFS+AUTOFS
  10. 看上冰岛的域名con.is