題目:倒水問題,有已知容量的三個杯子,前兩個是空的最後的是滿的。

每次可以將一杯水倒向另一杯,只可能是全部倒進去,或者被倒的杯子滿了。

求到達目標,最小的移動水量,如果沒有目標求出不超過的最大值。

分析:圖論、搜索。利用優先隊列(移動水的量為條件)bfs求解即可。

說明:注意使用memset會超時╮(╯▽╰)╭。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>using namespace std;class node
{
public:int jugs[3];int total;node(){};node(int a, int b, int c, int d){ jugs[0] = a;jugs[1] = b;jugs[2] = c;total = d;}bool operator < (const node & x) const{return total > x.total;}
};int  visit[222][222][222];
node bfs(int jugs[], int d)
{for (int i = 0; i <= jugs[0]; ++ i) {for (int j = 0; j <= jugs[1]; ++ j) {for (int k = 0; k <= jugs[2]; ++ k) {visit[i][j][k] = 0;}}} priority_queue<node> Q;Q.push(node(0, 0, jugs[2], 0));visit[0][0][jugs[2]] = 1;node ans(0, 0, 0, 0);if (jugs[2] <= d) {ans.jugs[2] = jugs[2];}while (!Q.empty()) {node New, now = Q.top();Q.pop();if (now.jugs[0] == d || now.jugs[1] == d || now.jugs[2] == d) {now.jugs[2] = d;return now;}for (int i = 0 ; i < 3; ++ i) {if (now.jugs[i] < d && now.jugs[i] > ans.jugs[2]) {ans.jugs[2] = now.jugs[i];ans.total = now.total;}}// 将 j 倒入 i for (int i = 0; i < 3; ++ i) {for (int j = 0; j < 3; ++ j) {if (i != j) {if (now.jugs[i] + now.jugs[j] > jugs[i]) {New.jugs[i] = jugs[i];New.jugs[j] = now.jugs[i] + now.jugs[j] - jugs[i];New.jugs[3-i-j] = now.jugs[3-i-j];New.total = now.total + jugs[i] - now.jugs[i];}else {New.jugs[i] = now.jugs[i] + now.jugs[j];New.jugs[j] = 0;New.jugs[3-i-j] = now.jugs[3-i-j];New.total = now.total + now.jugs[j];}if (!visit[New.jugs[0]][New.jugs[1]][New.jugs[2]]) {visit[New.jugs[0]][New.jugs[1]][New.jugs[2]] = 1;Q.push(New);}}}}}return ans;
}int main()
{int n, jugs[3], d;scanf("%d",&n);while (n --) {scanf("%d%d%d%d", &jugs[0], &jugs[1], &jugs[2], &d);node ans = bfs(jugs, d);printf("%d %d\n", ans.total, ans.jugs[2]);}return 0;
}

UVa 10603 - Fille相关推荐

  1. UVA 10603 - Fill(dijkstra + 状态图)

    题目链接 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  2. UVA 10603 Fill

    这道题其实是个隐形图(bfs),由开始状态往后面推就行了 #include<iostream> #include<cstdio> #include<algorithm&g ...

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

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

  4. 倒水问题(Fill,UVA 10603) lrj白书 p202

    看着lrj的代码自己敲了一遍,还没调试成功.... 有时间再进行完善 /*状态start到各个状态u1,u2,u3.....的倒水量分别为u1.dist,u2.dist,u3.dist....*//* ...

  5. UVa 10603 Fill (BFS+优先队列)

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

  6. J - Fill (UVA - 10603)

    - 题目大意 有三个已知体积但不知刻度的杯子,前两个杯子中初始时没有水,第三个装满水,问是否可以倒出d升水,如果倒不出,则倒出一个最大的d',使得d'<=d,并且在这个过程中要求总倒水量最少. ...

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

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

  8. 紫书《算法竞赛入门经典》

    紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...

  9. 初学者acm的练习题指南

    上机练习题参考题 忘了在哪找的啦~~希望对大家有帮助呦 <!--[if !supportLists]-->1.    <!--[endif]-->Programming Bas ...

最新文章

  1. com.sun.crypto.provider.SunJCE
  2. 如何对加载的数个模型只进行transform呢
  3. Celery分布式任务队列的认识和基本操作
  4. java 解析时间字符串_Java8解析给定字符串的日期或日期时间格式
  5. 2-7 StatusStrip 控件
  6. android 自动打印出来,Android:签名打包后关闭Log打印
  7. 什么是mysql 的冗余备份_什么是数据库中的“数据冗余”?
  8. latex 打出罗马数字
  9. phpwind 安装教程图文说明
  10. arcgis10.2绘制矢量数据面polygon
  11. 【前端性能优化】长列表优化
  12. JAVA基础试题抄录
  13. MySQL 与 Navicat for MySQL
  14. 帝国cms 操作整理
  15. linux双屏鼠标移,ubuntu如何实现双屏显示
  16. 安卓,运维,大数据,前端,java,区块链学习路线
  17. 快手校招真题-最少数量货物装箱问题(动态规划)
  18. 硬盘分区、格式化及文件系统的管理一
  19. 今天用JAVA写一个坦克大战游戏tankwar
  20. 亲身体验微软的 - 视窗梦幻桌面(DreamScene)

热门文章

  1. Java计算平均成绩
  2. UiPath:以API接口方式启动流程
  3. 航空中的QNH QNE QFE分别都是什么
  4. 求两个字符串的最大连续公共字串
  5. interpro 数据库
  6. Ioc之Bean基础
  7. Python 简单编写一个注册邮箱
  8. ppi 各代iphone_这样的iphone12,好看还中用,必须买!
  9. NOIP2018备战笔记
  10. 考研-英语经验贴2.0