UVa 10603 倒水问题
https://vjudge.net/problem/UVA-10603
题意:三个杯子,倒水问题。找出最少倒水量。
思路:路径寻找问题。不难,暴力枚举。
#include<iostream>
#include<queue>
#include<string>
#include<cstring>
using namespace std; int a, b, c, d;
int vis[][]; //访问变量,因为只有三个杯子,所以记录前两个杯子的状态即可
int cap[];
int ans[]; struct Node
{
int v[], dist;
bool operator <(const Node& rhs) const //重载小于号
{
return dist>rhs.dist;
}
}; void update(Node u) //每次有新状态时,记录形成d升水时需要的最少倒水量
{
for (int i = ; i < ; i++)
{
int x = u.v[i];
if (ans[x] < || u.dist < ans[x]) ans[x] = u.dist;
}
} void bfs()
{
cap[] = a, cap[] = b, cap[] = c; //记录三个杯子的容量
memset(vis, , sizeof(vis));
memset(ans, -, sizeof(ans));
priority_queue<Node> q;
Node start;
start.v[] = ; start.v[] = ; start.v[] = c; start.dist = ;
q.push(start);
vis[][] = ; //设置初始状态为已访问
while (!q.empty())
{
Node p = q.top();
q.pop(); update(p);
if (ans[d] >= ) break; //找到目标状态,退出循环 for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{ if (i != j && p.v[i]!= && p.v[j]<cap[j]) //不能给自己倒水并且第i个杯子有水和第j个杯子未满
{
Node u=p; //建立新状态
int r = cap[j] - p.v[j]; //计算第j个杯子空余水量
if (p.v[i] >= r) //如果第i个杯子水量充足
{
u.dist = p.dist + r; //更新后的倒水量
u.v[j] = p.v[j] + r; //更新后第j个杯子水量
u.v[i] = p.v[i] - r; //更新后第i个杯子水量
}
else //如果第i个杯子水量不足
{
u.dist = p.dist + p.v[i];
u.v[j] = p.v[j] + p.v[i];
u.v[i] = ;
}
if(!vis[u.v[]][u.v[]]) //如果该状态没出现过
{
vis[u.v[]][u.v[]] = ;
q.push(u);
}
} }
} } while (d >= )
{
if (ans[d] >= )
{
cout << ans[d] << " " << d << endl;
return;
}
d--; //如果无法做到d升,则检验d--,找到最接近d升
}
} int main()
{
//freopen("D:\\txt.txt","r", stdin);
int n;
cin >> n;
while (n--)
{
cin >> a >> b >> c >> d;
bfs();
}
return ;
}
UVa 10603 倒水问题的更多相关文章
- 倒水问题(Fill, UVa 10603)
[题目描述] 有三个没有刻度的水壶,容量分别为a,b和c(单位为升,都是<=200的正整数).初始时前两个水壶是空的,而第三个装满了水.每次可以从一个水壶往一个水壶里倒水,直到一个水壶倒空或者另 ...
- 倒水问题UVA 10603——隐式图&&Dijkstra
题目 给你三个容量分别为 $a,b,c$ 的杯子,最初只有第3个杯子装满了水,其他两个杯子为空.最少需要到多少水才能让一个某个杯子中的水有 $d$ 升呢?如果无法做到恰好 $d$ 升,就让某个杯子里的 ...
- UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)
题意 : 有装满水的6升的杯子.空的3升杯子和1升杯子,3个杯子中都没有刻度.不使用道具情况下,是否可量出4升水呢? 你的任务是解决一般性的问题:设3个杯子的容量分别为a, b, c,最初只有第3个杯 ...
- 倒水问题(Fill,UVA 10603) lrj白书 p202
看着lrj的代码自己敲了一遍,还没调试成功.... 有时间再进行完善 /* 状态start到各个状态u1,u2,u3..... 的倒水量分别为u1.dist,u2.dist,u3.dist.... * ...
- UVA 10603 - Fill BFS~
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&c ...
- UVA 10603 Fill
题意: 题目的意思是倒水,给出的四个数据是第一个水杯,第二个水杯,第三个水杯,和目标水量.一开始只有第三个水杯是满的,剩下的水杯是空的.倒水的时候只能把倒水出来的这个杯子倒空,或是倒水进去的杯子倒满. ...
- UVA 10603 Fill(正确代码尽管非常搓,网上很多代码都不能AC)
题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=1544">click here~ ...
- UVa 10603 Fill (暴力BFS+优先队列)
题意:给定4个数,a,b,c,d,分别代表空杯子容积为a,b,一个盛满水的杯子容积为c,让你不断倒水,找一个dd,是不是存在某个时刻, 某个杯子里的水dd,和d相同,或者无限接近.让求最少的倒水量和d ...
- UVA - 10603 Fill(隐式图搜索)
题目大意:经典的倒水问题. 给你三个瓶子,体积为a,b,c. 刚開始a.b是空的,c是满的,如今要求你到出体积为d的水.倒水的规则为,要么倒水方为空,要么接水方满 问倒到容量为d时,倒水的最小体积是多 ...
随机推荐
- [py]约瑟夫问题-循环队列
约瑟夫问题(历史战争问题) 直观理解 老外视频讲解 模拟器演示 约瑟夫问题 数学姥公众号 讲的最清楚 背景及,推倒过程讲解得很清晰,旨在提高人们对数据的兴趣 简单说下: 几个人围成一圈(循环队列), ...
- HDU1712:ACboy needs your help(分组背包模板)
http://acm.hdu.edu.cn/showproblem.php?pid=1712 Problem Description ACboy has N courses this term, an ...
- 从 Zero 到 Hero ,一文掌握 Python
译文:开源中国 www.oschina.net/translate/learning-python-from-zero-to-hero 第一个问题,什么是 Python ?根据 Python 之父 G ...
- CentOS6.5安装Redis数据库
1.以安装redis2.8.19为例 下载安装包:http://redis.io tar zxvf redis-2.8.19.tar.gz #解压 cd redis-2.8.19 #进入解压后的文件夹 ...
- 7.12 Models -- Frequently Asked Questions
一.Should I use a query or a filter to seach records?我应该使用一个查询或者过滤器来搜索记录吗? 这取决于你想要搜索多少reocrds并且它们是否被加 ...
- 2:4 动态方法的调用(简化Action的配置)
动态方法的第一种方法: 所以我们要手动设置 动态调用的开关打开:strus-core-jar里面:修改常量 使用方法: 根据请求来区分用哪个方法处理,处理完了,注意要在该方法里面返回与请求相同的字符串 ...
- xhtml 的三种 doctype
{1}文档宣告 <!ODCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 [there]//EN" "http://www.w4org/TR/xhtml1/DTD/ ...
- VS2010/MFC编程入门之四十(文档、视图和框架:各对象之间的关系)
前面一节中鸡啄米进行了文档.视图和框架的概述,本节主要讲解文档.视图.框架结构中各对象之间的关系. 各个对象之间的关系 文档.视图.框架结构中涉及到的对象主要有:应用程序对象.文档模板对象.文档对象. ...
- Bootstrap3-文字样式
Bootstrap将全局font-size设置为14px,line-height为1.428.这些属性直接赋给<body>和所有段落元素.另外,<p>(段落)还被设置了等于1/ ...
- Excel导出插件-VSTO
前言 一个游戏通常需要10多个Excel表格或者更多来配置,一般会通过导出csv格式读取配置. 本文提供导出Excel直接生成c#文件,对应数据直接生成结构体和数组,方便开发排错和简化重复写每个表格的 ...