【路径寻找问题】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 ...
随机推荐
- 排序算法之直接插入排序(java实现)
package com.javaTest300; import java.util.Arrays; public class Test041 { public static void main(Str ...
- 多浏览器兼容flv视频播放HTML
HTML: <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http: ...
- C语言简单实现sizeof功能代码
sizeof不是函数,而是运算符,C/C++语言编译器在预编译阶段的时候就已经处理完了sizeof的问题,也就是说sizeof类似于宏定义. 下面给出一个sizeof的一个宏定义实现版本 #defin ...
- Castle IOC容器快速入门
主要内容 1.为什么要IOC 2.什么是Castle IOC容器 3.快速入门示例 4.几个重要的概念 一,为什么要IOC IOC(控制反转或者叫依赖注入)Martin Fowler大师在他的文章中已 ...
- SQL Server 2008 Data Types and Entity Framework 4
Because I’ve had a lot of conversations about spatial data types lately, I thought I would create a ...
- 对iOS中MVC的理解
总结于斯坦福大学的白头发老头的公开课 模型-控制器-视图(MVC)是一种将应用中给所有类组织起来的策略 模型(Model)实际上考虑的是“什么”的问题,即你的程序是什么? 以纸牌匹配游戏为例子,模型就 ...
- 转移部分博客到CSDN之中
之前的文章一直发布在个人博客ivyxjc.xyz中, 现在将一部分博客移到csdn博客中.
- SAP BW顾问如何保持市场竞争力
跟大部分电工一样,SAP顾问也经常有迷茫的时候.因为,这个世界变化实在太快了.每一个电工,总是在担心自己会不会被飞速发展的技术所淘汰.那么,作为 一个BW顾问,应该如何保持市场竞争力呢?我觉得需要两个 ...
- 密码强度应用(js)
<!-- 密码强度div --> <div id="tips" class="help-block"> <b class=&quo ...
- 偶然发现关于网页JavaScript脚本无法正常运行的原因
客户常常打电话投诉公司的销售系统有问题, 后来发现有的客户直接把网址设为受限网站,才导致系统无法正常执行.改动后正常.