uva10603-倒水问题-暴力枚举-隐式图搜索
题意:
给你三个杯子,a,b,c,没有刻度,刚开始c杯是满的,倒水的要求,要么倒出水的杯子倒空,要么倒入杯子倒满.
结果:
要求某个杯子内有d水量,并且倒出的水量最少,如果倒不出d水量,那么倒出d1(d1<d)水量,并且倒出的水量最少
解题思路:
总的水量为c,只要知道前俩个杯子的水量,那么第三个杯子的水量就确定了,所以,状态数最大只有a * b种,所以一个二维数组标记状态就够.
要求倒出的水量最少,那么使用优先队列,按照倒出的水量最少开始搜索.
初始化结点为(0,0,c),由这个结点开始往外扩展,此时倒出的水量为0,结果d为0,注意代码内有个特判,如果d >= c,那么最大的d就是c,倒出的水量为0
#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <queue> using namespace std;
const int NN = 201;
int a[3];
int d;
int maxD = -1;
int maxNum = 0;
//记录c1,c2,已知c1,c2,c3就可以确定
int vis[NN][NN];
class State
{
public:
int a[3];
int waterNum;
State()
: waterNum(0)
{
a[0] = 0;
a[1] = 0;
a[2] = 0;
}
State(int d1, int d2, int d3, int w)
: waterNum(w)
{
a[0] = d1;
a[1] = d2;
a[2] = d3;
}
bool operator ()(State& a, State& b)
{
return a.waterNum > b.waterNum;
}
};
priority_queue<State, vector<State>, State> q;
void bfs()
{
while (!q.empty())
{
State s = q.top();
q.pop();
for(int i = 0; i < 3; i++)
for(int j = 0; j < 3; j++)
{
if(i == j || s.a[i] == 0)
continue;
//把水从i导入j中
//要么i倒空,要么j倒满
int dj = a[j] - s.a[j];
if(dj == 0)
//j是满的,不能倒
continue;
//i杯内的水量
int di = s.a[i];
//倒出的水量
State ss(s.a[0], s.a[1], s.a[2], s.waterNum);
if(dj > di)
{
//i杯倒空
ss.waterNum = ss.waterNum + di;
ss.a[i] = 0;
ss.a[j] = ss.a[j] + di;
}
else
{
//j杯倒满
ss.waterNum = ss.waterNum + dj;
ss.a[i] = di - dj;
ss.a[j] = ss.a[j] + dj;
}
if(vis[ss.a[0]][ss.a[1]])
continue;
//判断当前状态
if(ss.a[i] <= d && ss.a[i] > maxD)
{
maxD = ss.a[i];
maxNum = ss.waterNum;
}
if(ss.a[j] <= d && ss.a[j] > maxD)
{
maxD = ss.a[j];
maxNum = ss.waterNum;
}
if(maxD == d)
return;
q.push(ss);
vis[ss.a[0]][ss.a[1]] = 1;
}
}
}
void clear()
{
while (!q.empty())
q.pop();
memset(vis, 0, sizeof(vis));
maxNum = 0;
maxD = 0;
}
int main()
{
int num;
cin >> num;
while (num--)
{
clear();
cin >> a[0] >> a[1] >> a[2] >> d;
if(d >= a[2])
{
cout << 0 << " " << a[2] << endl;
continue;
}
State state(0, 0, a[2], 0);
q.push(state);
vis[0][0] = 1;
bfs();
if(maxD == 0)
cout << 0 << " " << 0 << endl;
else
cout << maxNum << " " << maxD << endl;
}
return 0;
}
uva10603-倒水问题-暴力枚举-隐式图搜索的更多相关文章
- uva-321-暴力枚举-隐式图搜索
题意:给你n个房间,有许多灯的控制开关,i房间灯的开关在j房间,未开灯的房间不能进,i房间和j房间之间如果没有门,也不能从i进入到j,开始房间是1,并且灯是开着的,问你是否能够走到最后一个房间n,并且 ...
- UVa 658 - It's not a Bug, it's a Feature!(Dijkstra + 隐式图搜索)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 紫书 例题 11-6 UVa 658 (状态压缩+隐式图搜索+最短路)
这道题用到了很多知识点, 是一道好题目. 第一用了状态压缩, 因为这里最多只有20位, 所以可以用二进制来储存状态 (要对数据范围敏感), 然后 涉及到了一些位运算. 第二这里是隐式 ...
- 【uva 658】It's not a Bug, it's a Feature!(图论--Dijkstra或spfa算法+二进制表示+类“隐式图搜索”)
题意:有N个潜在的bug和m个补丁,每个补丁用长为N的字符串表示.首先输入bug数目以及补丁数目.然后就是对M个补丁的描述,共有M行.每行首先是一个整数,表明打该补丁所需要的时间.然后是两个字符串,第 ...
- uva 10274 Fans and Gems(隐式图搜索+模拟)
Fans and Gems Input: Standard Input Output: Standard Output Tomy's fond of a game called 'Fans and G ...
- [HNOI2006]最短母串问题 --- AC自动机 + 隐式图搜索
[HNOI2006]最短母串问题 题目描述: 给定n个字符串(S1,S2.....,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,......,Sn)都是T的子串. 输入格式: 第 ...
- 洛谷 P2622 关灯问题II【状压DP;隐式图搜索】
题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时 ...
- UVA_10603 倒水问题 隐式图搜索
这道题目是刘汝佳白书上的例题,没有LRJ在白书上提到的划归为搜索问题,还真是一时难以想到好的解法.即三个瓶子,任意的一个状态都是一个节点,最后就划归为一个搜索问题. 由于题目数据量不大,三个杯子容量都 ...
- 状态转移的最短路 隐式图搜索 UVA 658
紫书365 题目大意:给你n个全都是bug的东西,然后每次可以修复,给你修复前后的状态,问最后如果能把bug全都修复,最少需要多少时间. 思路:从最初状态开始,然后枚举bug即可. 表示priorit ...
随机推荐
- php限制文件下载速度的代码
有时候你会出于某种目的而要求把下载文件的速度放慢一些,例如你想实现文件下载进度条功能.限制下载速度最大的好处是节省带宽,避免瞬时流量过大而造成网络堵塞.本文将和你分享如何通过php代码来实现限制文件的 ...
- Excel技巧--让折线图带面积更直观生动
上图为带面积的折线图,比单纯的折线图更直观更好看. 制作办法: 1.先制作纯折线图: 2.再复制一遍数据列,选中图表,点击粘贴(ctrl+v): 3.右键图表,点击“更改图表类型”,对话框如下设置: ...
- C#之实现Scoket心跳机制
C#之实现Scoket心跳机制 标签: UnityC#TCPSocket心跳 2017-05-17 09:58 1716人阅读 评论(0) 收藏 举报 分类: Unity(134) C#(6) ...
- Gradle详细解析***
前言 对于Android工程师来说编译/打包等问题立即就成痛点了.一个APP有多个版本,Release版.Debug版.Test版.甚至针对不同APP Store都有不同的版本.在以前ROM的环境下, ...
- 无需AutoCAD,用C#生成DWG文件
是一个类库:Teigha.NET for .DWG 利用它就可以在无需安装AutoCAD软件的情况下,生成.读取DWG文件,适合那些导入导出的场合. Teigha曾用名OpenDWG .DWGdire ...
- bzoj4814: [Cqoi2017]小Q的草稿
Description 小Q是个程序员.众所周知,程序员在写程序的时候经常需要草稿纸.小Q现在需要一张草稿纸用来画图,但是桌上 只有一张草稿纸,而且是一张被用过很多次的草稿纸.草稿纸可以看作一个二维平 ...
- itertools库中product函数用法 (即可以随机出所有组合,因果图那样的)
- QLExpress 规则引擎使用介绍
一个轻量级的类java语法规则引擎,作为一个嵌入式规则引擎在业务系统中使用.让业务规则定义简便而不失灵活.让业务人员就可以定义业务规则.支持标准的JAVA语法,还可以支持自定义操作符号.操作符号重载. ...
- document.write的用处!
document.write是JavaScript中对document.open所开启的文档流(document stream操作的API方法,它能够直接在文档流中写入字符串,一旦文档流已经关闭,那d ...
- onunload事件火狐不支持,在IE浏览器中,只有刷新时该事件才发生
onunload事件火狐不支持,在IE浏览器中,只有刷新时该事件才发生