【路径寻找问题】UVa 10603 - Fill
如家大神书上的例题。第一次接触也是按代码敲得。敲的过程感觉很直观。但自己写估计会写的乱七八糟。以后不能砍得难就不愿意做这种题。否则只能做一些水题了。(PS:48)
紫书
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = ;
struct Node
{
int v[];
int dist; //总倒水量
bool operator < (const Node& a) const
{
return dist > a.dist;
}
};
int vis[maxn][maxn], ans[maxn];
int cap[];
void update_ans(const Node& u)
{
for(int i = ; i < ; i++)
{
int d = u.v[i]; //当前状态下每个杯的水量;
if(ans[d] < || u.dist < ans[d])
ans[d] = u.dist;
}
}
void solve(int a, int b, int c, int d)
{
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 u = q.top(); q.pop(); //选择倒水量少的扩展
update_ans(u);
if(ans[d] >= ) break;
for(int i = ; i < ; i++)
for(int j = ; j < ; j++)
{//把水从i倒入j
if(i == j) continue;
if(u.v[i] == || u.v[j] == cap[j]) continue; //i没水或j满
int amount = min(cap[j], u.v[i]+u.v[j]) - u.v[j]; //从i倒入j中水的量
Node v;
memcpy(&v, &u, sizeof(u));
v.v[i] -= amount; v.v[j] += amount; v.dist += amount;
if(!vis[v.v[]][v.v[]]) //状态记忆;因总水量一定,故只知道其中两个杯子的水量就可知当前状态。故记忆数组用二维即可
{
vis[v.v[]][v.v[]] = ;
q.push(v);
}
}
}
while(d >= ) //若达不到,则尽可能接近
{
if(ans[d] >= )
{
printf("%d %d\n", ans[d], d);
return ;
}
d--;
}
}
int main()
{
int T; scanf("%d", &T);
while(T--)
{
int a, b, c, n;
scanf("%d%d%d%d", &a, &b, &c, &n);
solve(a, b, c, n);
}
return ;
}
P205.直接上代码
【路径寻找问题】UVa 10603 - Fill的更多相关文章
- UVa 10603 Fill [暴力枚举、路径搜索]
10603 Fill There are three jugs with a volume of a, b and c liters. (a, b, and c are positive intege ...
- UVA 10603 Fill(正确代码尽管非常搓,网上很多代码都不能AC)
题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=1544">click here~ ...
- UVA 10603 - Fill BFS~
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&c ...
- UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)
题意 : 有装满水的6升的杯子.空的3升杯子和1升杯子,3个杯子中都没有刻度.不使用道具情况下,是否可量出4升水呢? 你的任务是解决一般性的问题:设3个杯子的容量分别为a, b, c,最初只有第3个杯 ...
- UVA 10603 Fill
题意: 题目的意思是倒水,给出的四个数据是第一个水杯,第二个水杯,第三个水杯,和目标水量.一开始只有第三个水杯是满的,剩下的水杯是空的.倒水的时候只能把倒水出来的这个杯子倒空,或是倒水进去的杯子倒满. ...
- 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时,倒水的最小体积是多 ...
- UVA - 10603 Fill(BFS求最小值问题)
题目: 给出三个杯子(没有刻度线)的容量,起初之后第三个杯子是满的,其他的两个杯子是空的,容量分别是a.b.c.问最少需要倒多少升水才能让某一个杯子中的水有d升?如果不能恰好做到d升,就让某一个杯子里 ...
- 八数码问题+路径寻找问题+bfs(隐式图的判重操作)
Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 p ...
随机推荐
- 关于scrollTop的那些事
大家在实际项目中,应该是要经常用到scrollTop的,它表示的是可视窗口距离页面顶部的距离,这个scrollTop是可读写的,所以可以用来做页面滚动. 但是大家或多或少遇到一些浏览器兼容问题,为什么 ...
- html5 标签
按字母顺序排列的标签列表 4: 指示在 HTML 4.01 中定义了该元素 5: 指示在 HTML 5 中定义了该元素 标签 描述 4 5 <!--...--> 定义注释. 4 5 < ...
- BZOJ 2243: [SDOI2011]染色 (树链剖分+线段树合并)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2243 树链剖分的点剖分+线段树.漏了一个小地方,调了一下午...... 还是要细心啊! 结 ...
- bash学习之变量的显示和设置
显示变量:echo $MAIL或者 echo ${MAIL} [CJP@CJP ~]$ echo $MAIL /var/spool/mail/CJP [CJP@CJP ~]$ echo ${MAIL} ...
- 发现一个不错的十六进制编辑器-HxD
十六进制编辑器我觉得是个必需的工具,遥想当年用文曲星的时候,Pacmanager.Ewayeditor…… 之前都在用WinHex,好用,但是是个收费软件,老用着破解版心里还是不舒服 后来发现这个名叫 ...
- Keil C51基本数据类型
- uva 11983 Weird Advertisement 扫描线
Weird Advertisement Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/probl ...
- 2015南阳CCPC F - The Battle of Guandu 多源多汇最短路
The Battle of Guandu Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 无 Description In the year of 200, t ...
- delphi 滚屏
滚屏 uses MSHTML;var a: IHTMLDocument2; x,y:Integer;begin y:=y+20; //加减进行上下滚动 a :=WebB ...
- 【Android开发学习之路】
http://blog.csdn.net/wwj_748/article/category/1119319