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 倒水问题的更多相关文章

  1. 倒水问题(Fill, UVa 10603)

    [题目描述] 有三个没有刻度的水壶,容量分别为a,b和c(单位为升,都是<=200的正整数).初始时前两个水壶是空的,而第三个装满了水.每次可以从一个水壶往一个水壶里倒水,直到一个水壶倒空或者另 ...

  2. 倒水问题UVA 10603——隐式图&&Dijkstra

    题目 给你三个容量分别为 $a,b,c$ 的杯子,最初只有第3个杯子装满了水,其他两个杯子为空.最少需要到多少水才能让一个某个杯子中的水有 $d$ 升呢?如果无法做到恰好 $d$ 升,就让某个杯子里的 ...

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

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

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

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

  5. UVA 10603 - Fill BFS~

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

  6. UVA 10603 Fill

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

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

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

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

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

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

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

随机推荐

  1. Tensorflow(二)

    1---------------- 试用tensorflow的模块,必须配套tensorflow的方法 import tensorflow as tf a=3 ##定义 行向量 w=tf.Variab ...

  2. 【剑指offer】重建二叉树

    一.题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7 ...

  3. [LeetCode] 198. House Robber _Easy tag: Dynamic Programming

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

  4. XenServer:使用XenCenter开设VPS(多图完整版)

    打铁要趁热,咱们接着来玩XenServer.昨天赵容用机房提供的KVM给服务器装了XenServer,今天我们来玩更有意思的:开小鸡.装好XenServer之后,访问我们的服务器IP,就可以看到Xen ...

  5. 弱分类器的进化--Bagging、Boosting、Stacking

    一般来说集成学习可以分为三大类: 用于减少方差的bagging 用于减少偏差的boosting 用于提升预测结果的stacking 一.Bagging(1996) 1.随机森林(1996) RF = ...

  6. Python 之 os.walk()

    原文地址https://www.cnblogs.com/JetpropelledSnake/p/8982495.html          http://www.runoob.com/python/o ...

  7. 7.9 Models -- Connection to An HTTP Server

    一.概述 1. 如果你的Ember应用程序需要从一个HTTP服务器加载JSON数据,在你的服务器返回的任何格式中,配置Ember Data的过程将会加载records. 2. store使用一个被称为 ...

  8. VMware coding Challenge:Date of Weekday

    这道题再次证明了这种细节的题目,画个图容易搞清楚 import java.util.Scanner; public class Solution2 { static int DateOfWeekday ...

  9. Django初级手册5-自动化测试

    什么是自动化测试 每次更新完系统后,可自动进行测试,而不是手工从头测试一遍: 从长远和全局的角度看,测试能节约我们的时间: 测试是一种积极的行为,它能预防问题,而不仅仅是识别问题: 测试有助于代码美观 ...

  10. 改变 select下拉框 样式

    select{ outline: none; text-indent: 10px; height: 45px; line-height: 45px; width: 100%; border:1px s ...