如家大神书上的例题。第一次接触也是按代码敲得。敲的过程感觉很直观。但自己写估计会写的乱七八糟。以后不能砍得难就不愿意做这种题。否则只能做一些水题了。(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的更多相关文章

  1. 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 ...

  2. UVA 10603 Fill(正确代码尽管非常搓,网上很多代码都不能AC)

    题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=1544">click here~ ...

  3. UVA 10603 - Fill BFS~

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&c ...

  4. UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)

    题意 : 有装满水的6升的杯子.空的3升杯子和1升杯子,3个杯子中都没有刻度.不使用道具情况下,是否可量出4升水呢? 你的任务是解决一般性的问题:设3个杯子的容量分别为a, b, c,最初只有第3个杯 ...

  5. UVA 10603 Fill

    题意: 题目的意思是倒水,给出的四个数据是第一个水杯,第二个水杯,第三个水杯,和目标水量.一开始只有第三个水杯是满的,剩下的水杯是空的.倒水的时候只能把倒水出来的这个杯子倒空,或是倒水进去的杯子倒满. ...

  6. UVa 10603 Fill (暴力BFS+优先队列)

    题意:给定4个数,a,b,c,d,分别代表空杯子容积为a,b,一个盛满水的杯子容积为c,让你不断倒水,找一个dd,是不是存在某个时刻, 某个杯子里的水dd,和d相同,或者无限接近.让求最少的倒水量和d ...

  7. UVA - 10603 Fill(隐式图搜索)

    题目大意:经典的倒水问题. 给你三个瓶子,体积为a,b,c. 刚開始a.b是空的,c是满的,如今要求你到出体积为d的水.倒水的规则为,要么倒水方为空,要么接水方满 问倒到容量为d时,倒水的最小体积是多 ...

  8. UVA - 10603 Fill(BFS求最小值问题)

    题目: 给出三个杯子(没有刻度线)的容量,起初之后第三个杯子是满的,其他的两个杯子是空的,容量分别是a.b.c.问最少需要倒多少升水才能让某一个杯子中的水有d升?如果不能恰好做到d升,就让某一个杯子里 ...

  9. 八数码问题+路径寻找问题+bfs(隐式图的判重操作)

    Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 p ...

随机推荐

  1. 【转】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程

    http://blog.csdn.net/xiaominghimi/article/details/6937097 //——2012-12-11日更新   获取"产品付费数量等于0这个问题& ...

  2. Com进程通信(Delphi2007)

    相关资料: 1.http://my.oschina.net/u/582827/blog/2847662.http://www.cnblogs.com/findumars/p/5277561.html3 ...

  3. hdu 1689 Just a Hook

    http://acm.hdu.edu.cn/showproblem.php?pid=1698 Just a Hook Time Limit: 4000/2000 MS (Java/Others)    ...

  4. MySQL安装配置最后时未响应解决方法

    安装MySQL出示未响应,一般显示在安装MySQL程序最后一步的2,3项就不动了. 这种情况一般是你以前安装过MySQL数据库服务项被占用了.解决方法:一种方法:你可以安装MySQL的时候在这一步时它 ...

  5. rop框架签名功能控制

    平台级控制: 通过<rop:annotation-driven/>的 sign-enable 属性即可开启或关闭服务平台签名验证功能:<rop:annotation-driven s ...

  6. Serializable 剔除某些不想保存的字段 transient

    示例: package cn.com.chinatelecom.mms.pojo; import java.io.Serializable; public class Person implement ...

  7. 代码静态分析工具——splint的学习与使用

    引言 最近在项目中使用了静态程序分析工具PC-Lint,体会到它在项目实施中带给开发人员的方便.PC-Lint是一款针对C/C++语言.windows平台的静态分析工具,FlexeLint是针对其他平 ...

  8. .Net 代码安全保护产品DNGuard HVM使用

    前辈人物写的程序啊! 官方网站:http://www.dnguard.net/index.aspx 官方博客:http://www.cnblogs.com/rick/ (很久没更新了) 原文http: ...

  9. 在VS.NET中根据条件设置不同的MainForm

    在VS.NET中有时候需要根据不同的条件设置不同的MainForm,例如:在程序第一次运行时候打开设置基本信息或服务器信息窗口等. 1.找到VS.NET中设置MainForm的窗口: 2.在编辑窗口中 ...

  10. VMware Workstation 11.0 官方中文版最强虚拟机软件(附下载地址)

    VMware Workstation 11.0 新版本功能一览: 支持 Windows 8.1 Update.Windows Server 2012 R2.Ubuntu 14.10.RHEL 7.Ce ...