状态空间搜索好题UVA10603
题目
分析:注意这里求的是最少流量, 二不是最少步数!!!所以我们用优先队列去维护一个最小流量,然后进行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相关推荐
- 搜索问题之状态空间搜索(状态压缩+记忆化搜索+ BFS)
文章目录 1. 前言 2. 问题举例(九宫格问题) 3. 问题分析 3.1 状态编码与解码 3.2 哈希映射 3.3 集合判重 4. 问题实现 推荐阅读 1. 前言 之前介绍的回溯法常用于 解空间的搜 ...
- 7.搜索求解策略: 搜索的概念, 状态空间搜索, 盲目/启发式图搜索策略, 启发信息和估价函数, A搜索算法, A*搜索算法及特性分析
本文内容为浙江工业大学王万良慕课课程的课程讲义, 将其整理为OneNote笔记同时添加了本人上课时的课堂笔记, 且主页中的思维导图就是根据课件内容整理而来, 为了方便大家和自己查看,特将此上传到CSD ...
- 迷宫问题(寻路)和状态空间搜索
迷宫问题以及状态空间搜索的实现,有赖于栈和队列这些数据结构的支持. 1. 解迷宫问题 解迷宫问题是一种常见智力游戏,也可以视为许多实际问题的反映和抽象.例如: 在公路网或铁路网上查找可行的或最优的路线 ...
- 状态空间搜索或者空间搜索或者迷宫问题总结(递归法、回溯法)Python(递归一般用栈,回溯是循环)
状态空间搜索问题或者称迷宫问题的基本特征是: 1.存在一集合可能状态(位置.情况等.这一集合可能很大).例:迷宫问题中的可能位置. 2.有一个初始状态S0,一个或者多个结束状态,或者有判断成功结束的方 ...
- ACM本周搜索做题小结和心得体会
这周除了接着看上次没看完剩下的题,主要的就是做题了 我把这周新学到的和以前还没总结过的以及做题心得再主要说一下 这周做题和看到的主要是以下这几类 我把这周做题时遇到的某几类题简单归了一下类然后总结 遍 ...
- hdu3786 Floyd或搜索 水题
题意: 找出直系亲属 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 2018-2-22 《啊哈,算法》再练习广度优先搜索,题:炸怪兽, 2-23改用深度优先搜索。宝岛探险(广度,深度,及地图着色)2-24水管工游戏,2-25测试水管工代码...
2小时. 先是是纠错,通过对代码运行过程的测试.发现是变量打错.以及录入地图❌. 重构练习题,改使用while..end代替for in. ⚠️ : 在while(k <= n)中如果用到nex ...
- UVA10118(记忆化搜索 + 好题)
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19440 题意,4堆不同颜色的糖果,每堆N个,从堆上往下拿,放入一个最大装5个 ...
- noip搜索模拟题 骰子
骰子 dice.cpp/c/pas 1s/128M [题目描述] 桌面上有两个特别的骰子.骰子的每一个面,都写了一个不同的数字.设第一个骰子上下左右前后分别为a1, a2, a3, a4, a5, a ...
最新文章
- java获取文件的所有者_java获取文件夹下所有文件的名称 | 星尘
- 南京大学《物联网技术导论》课程
- Mac OS X10.11(OS X EI Capitan)安装程序下载
- EF6 在原有数据库中使用 CodeFirst 总复习(四、新建实体对象)
- 一文搞定Mysql日期时间函数
- why SAP OData default 100 entries are returned
- C/C++ 中变量的声明、定义、初始化的区别
- php简单分页,php简单实现分页查询的方法
- slot多作用域 vue_详解Vue.js 作用域、slot用法(单个slot、具名slot)
- Windows 95被做成了一款软件,可玩扫雷和纸牌
- java文件写入_java怎么写入文件
- JAVA面试--电商业内大厂
- Django 模板层
- QLineEdit使用正则表达式小剖析
- Markdown 标记语言指北
- 李航《统计学习方法》多项式函数拟合问题--最小二乘法
- Cisco防火墙基础介绍及配置
- 解决: 在路径为[/StudentManagerWeb]的上下文中,servlet[LoginServlet]的Servlet.service()引发异常 java.lang.NullPointe
- 如何快速查询京东快递物流正在派送中的单号
- 关于高通平台下camera一些参数的设置