UVA 10603 - Fill BFS~
题目大意:
有3个没有刻度的水壶,容量分别为a,b,c(均不超过200的正整数)。初始时候前两个水壶空,第三个装满了水。每次可以从一个水壶往另一个水壶倒水,直到其中一个水壶倒空或者另一个水壶倒满。为了使某个水壶恰好有d升水,至少要倒多少升的水?如果无解,则找一个小于且最接近于d的d'代替。
输出要求输出至少倒多少升水 和 d(d')
思路:
把能达到的状态看成图上的点,进行BFS。
然后我用的是优先队列,能保证最少倒的条件。(按当前倒的水量维护好了)
建模确实不太好建。
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int MAXN=200+10;
const int INF=2000000;
bool vis[MAXN][MAXN][MAXN];
int state[3],d,ans;
struct node
{
int state[3];
int val;
node(){}
node(int aa,int bb,int cc,int dd){ state[0]=aa;state[1]=bb;state[2]=cc;val=dd;}
bool operator <(const node & x)const
{
return val>x.val;
}
};
void bfs()
{
memset(vis,0,sizeof(vis));
priority_queue<node> q;
q.push(node(0,0,state[2],0));
vis[0][0][state[2]]=true;
while(!q.empty())
{
node cur=q.top();
q.pop(); if(cur.state[0]==d || cur.state[1]==d || cur.state[2]==d)
{
ans=cur.val;
return;
} for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++) //j往i倒水
{
if(i==j) continue; //不能自己给自己倒水
if(!cur.state[j]) continue; //为空不行
node temp;
int *t=temp.state; //用指针优化下可读性 就是说t和temp.state是一个数组
if(cur.state[j] + cur.state[i] > state[i]) //超过了容量,只能倒满
{
t[i]=state[i];
t[j]=cur.state[j] + cur.state[i] -state[i];
t[3-i-j]=cur.state[3-i-j]; //3=0+1+2 所以减去代表剩下的那个
temp.val=cur.val+state[i] - cur.state[i];
}
else
{
t[i]=cur.state[j] + cur.state[i];
t[j]=0;
t[3-i-j]=cur.state[3-i-j];
temp.val=cur.val+cur.state[j];
}
if(!vis[ t[0] ][ t[1] ][ t[2] ]) //没访问过才加入队列
{
vis[ t[0] ][ t[1] ][ t[2] ]=true;
q.push(temp);
}
}
} }
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
ans=INF;
scanf("%d%d%d%d",&state[0],&state[1],&state[2],&d);
bfs();
while(ans==INF)
{
d--;
bfs();
}
printf("%d %d\n",ans,d);
}
return 0;
}
UVA 10603 - Fill BFS~的更多相关文章
- UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)
题意 : 有装满水的6升的杯子.空的3升杯子和1升杯子,3个杯子中都没有刻度.不使用道具情况下,是否可量出4升水呢? 你的任务是解决一般性的问题:设3个杯子的容量分别为a, b, c,最初只有第3个杯 ...
- 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 (暴力BFS+优先队列)
题意:给定4个数,a,b,c,d,分别代表空杯子容积为a,b,一个盛满水的杯子容积为c,让你不断倒水,找一个dd,是不是存在某个时刻, 某个杯子里的水dd,和d相同,或者无限接近.让求最少的倒水量和d ...
- UVA - 10603 Fill(BFS求最小值问题)
题目: 给出三个杯子(没有刻度线)的容量,起初之后第三个杯子是满的,其他的两个杯子是空的,容量分别是a.b.c.问最少需要倒多少升水才能让某一个杯子中的水有d升?如果不能恰好做到d升,就让某一个杯子里 ...
- UVA 10603 Fill(正确代码尽管非常搓,网上很多代码都不能AC)
题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=1544">click here~ ...
- UVA 10603 Fill
题意: 题目的意思是倒水,给出的四个数据是第一个水杯,第二个水杯,第三个水杯,和目标水量.一开始只有第三个水杯是满的,剩下的水杯是空的.倒水的时候只能把倒水出来的这个杯子倒空,或是倒水进去的杯子倒满. ...
- UVA - 10603 Fill(隐式图搜索)
题目大意:经典的倒水问题. 给你三个瓶子,体积为a,b,c. 刚開始a.b是空的,c是满的,如今要求你到出体积为d的水.倒水的规则为,要么倒水方为空,要么接水方满 问倒到容量为d时,倒水的最小体积是多 ...
- 【路径寻找问题】UVa 10603 - Fill
如家大神书上的例题.第一次接触也是按代码敲得.敲的过程感觉很直观.但自己写估计会写的乱七八糟.以后不能砍得难就不愿意做这种题.否则只能做一些水题了.(PS:48) 紫书 #include<ios ...
- 倒水问题(Fill, UVa 10603)
[题目描述] 有三个没有刻度的水壶,容量分别为a,b和c(单位为升,都是<=200的正整数).初始时前两个水壶是空的,而第三个装满了水.每次可以从一个水壶往一个水壶里倒水,直到一个水壶倒空或者另 ...
随机推荐
- js---16继承
123 instanceof Number;//false,要左边是对象右边是函数 typeof 123 ; //number new Number(123) instanceof Number; / ...
- c/c++中static与extern关键字介绍
一.C语言中的static关键字 在C语言中,static可以用来修饰局部变量,全局变量以及函数.在不同的情况下static的作用不尽相同. (1)修饰局部变量 一般情况下,对于局部变量是存放在栈区的 ...
- c++位运算符介绍
下面是C/C++位操作运算符列表,其中运算符优先级为从上到下递减,但<<,>>优先级相同. C/C++位操作运算符 操作符 功能 用法 ~ 位求反 ~expr << ...
- typeof 和 instanceof 的区别
在JavaScript中我们想得到一个变量的类型,我们一般会用typeof 得到这个类型的 字符串,但是对于引用类型,typeof始终会返回一个"object",在我们js中有十个 ...
- Android自定义组件系列【13】——Android自定义对话框如此简单
在我们的日常项目中很多地方会用到对话框,但是Android系统为我们提供的对话框样子和我们精心设计的界面很不协调,在这种情况下我们想很自由的定义对话框,或者有的时候我们的对话框是一个图片,没有标题和按 ...
- Android 关于::app:clean :app:preBuild UP-TO-DATE :app:preDebugBuild UP-TO-DATE,引用jar冲突问题
错误提示: Information:Gradle tasks [:app:clean, :app:generateDebugSources, :app:generateDebugAndroidTest ...
- POJ 2481 Cows (线段树)
Cows 题目:http://poj.org/problem?id=2481 题意:有N头牛,每仅仅牛有一个值[S,E],假设对于牛i和牛j来说,它们的值满足以下的条件则证明牛i比牛j强壮:Si &l ...
- 【试水CAS-4.0.3】第07节_CASclient配置单点登录
完整版见https://jadyer.github.io/2015/07/26/sso-cas-client-login/ 本文源代码下载:http://download.csdn.net/detai ...
- lubuntu自动登录(lxde)
lubuntu自动登录(lxde) 1.重启ubuntu,在grub界面长按shirft进入grub菜单: 2.选择recovery mode,按"e"键进入编辑页面: 3.把ro ...
- “此文件来自其他计算机,可能被阻止以帮助保护该计算机” 教你win7解除阻止程序运行怎么操作
win7 批量解除可执行文件的锁定 "此文件来自其他计算机,可能被阻止以帮助保护该计算机" http://blog.csdn.net/gscsnm/article/details/ ...