UVA 10603 Fill
题意:
题目的意思是倒水,给出的四个数据是第一个水杯,第二个水杯,第三个水杯,和目标水量。一开始只有第三个水杯是满的,剩下的水杯是空的。倒水的时候只能把倒水出来的这个杯子倒空,或是倒水进去的杯子倒满。 问最少转移多少水量,使三个杯子中(其中一个)出现目标水量。如果无法出现目标水量,就目标水量减一,还无法出现再减一。
分析:
bfs不需要退出条件,应该搜到所要状态都访问过为止。每得出一个新状态了,这时候这个状态下达到这三种水量的总倒水量,就是这个状态的里面累加上来的倒水量,如果小于之前记录的达到这三种水量的最小倒水量,就替换,当然如果这个水量是没有出现过的,就直接替换。到最后我们得到一个ans数组(前面说到的达到某种水量的最小倒水量)。初始目标水量是d那我们就先看ans[d] 如果是-1 ,说明从没出现过那就ans[d-1]直到出现不是-1的,就把最小倒水量值输出来,也把下标(这时的目标水量):
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
struct node
{
int v[3];
int dist;
bool operator <(const node& a) const
{
return dist>a.dist;
}
};
const int maxn=205;
int vis[maxn][maxn],cap[3],ans[maxn];
void solve(int a,int b,int c,int d)
{
memset(vis,0,sizeof(vis));
memset(ans,-1,sizeof(ans));
cap[0]=a;
cap[1]=b;
cap[2]=c;
priority_queue<node>q;
node start;
start.v[0]=start.v[1]=0;
start.v[2]=c;
start.dist=0;
q.push(start);
vis[0][0]=1;
while(!q.empty())
{
node u=q.top();
q.pop();
int i,j,k;
for(i=0;i<3;i++)
{
int d1=u.v[i];
if(ans[d1]<0||u.dist<ans[d1])
ans[d1]=u.dist;
//cout<<ans[d]<<endl;
}
if(ans[d]>=0)
break;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(i!=j)
{
//cout<<ans[d]<<endl;
if(u.v[i]==0||u.v[j]==cap[j])
continue;
int amount=min(cap[j],u.v[i]+u.v[j])-u.v[j];
node u2;
memcpy(&u2,&u,sizeof(u));
u2.dist=u.dist+amount;
u2.v[i]-=amount;
u2.v[j]+=amount;
if(!vis[u2.v[0]][u2.v[1]])
{
vis[u2.v[0]][u2.v[1]]=1;
q.push(u2);
}
}
}
}
}
while(d>=0)
{
//cout<<ans[d]<<endl;
if(ans[d]>=0)
{
printf("%d %d\n",ans[d],d);
return;
}
d--;
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
solve(a,b,c,d);
}
}
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
如家大神书上的例题.第一次接触也是按代码敲得.敲的过程感觉很直观.但自己写估计会写的乱七八糟.以后不能砍得难就不愿意做这种题.否则只能做一些水题了.(PS:48) 紫书 #include<ios ...
- 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升,就让某一个杯子里 ...
- UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)
题意 : 有装满水的6升的杯子.空的3升杯子和1升杯子,3个杯子中都没有刻度.不使用道具情况下,是否可量出4升水呢? 你的任务是解决一般性的问题:设3个杯子的容量分别为a, b, c,最初只有第3个杯 ...
- 倒水问题(Fill,UVA 10603) lrj白书 p202
看着lrj的代码自己敲了一遍,还没调试成功.... 有时间再进行完善 /* 状态start到各个状态u1,u2,u3..... 的倒水量分别为u1.dist,u2.dist,u3.dist.... * ...
随机推荐
- struts2复习(五)拦截器总结
1. 拦截器(Interceptor): 拦截器是Struts2的核心,Struts2的众多功能都是通过拦截器来实现的. 2. 拦截器的配置 1)编写实现Interceptor 接口的类. 2)在s ...
- Linux下的压缩zip,解压缩unzip命令具体解释及实例
实例:压缩server上当前文件夹的内容为xxx.zip文件 zip -r xxx.zip ./* 解压zip文件到当前文件夹 unzip filename.zip ================= ...
- GTID复制报错处理:Last_Error: Error 'Can't drop database 'test'; database doesn't exist' on query
创建GTID主从连接: mysql, master_user; 报错显示: Slave_IO_Running: Yes Slave_SQL_Running: No Last_Error: Error ...
- nginx默认虚拟主机
server { listen 80 default_server; server_name localhost; index index.html index.htm index.php; root ...
- 3GP文件格式研究
需要看的文档 http://www.3gpp.org/ftp/Specs/archive/26_series/ 3GPP TS 26.233 3GPP TS 26.243 3GPP TS 26.244 ...
- Android Studio自定义注释模板及生成JavaDoc
刚开始学习Android,使用了Android Studio IDE.为了将来生产JavaDoc,学习一下如何自定义注释模板. . 自定义注释模板 1. 通过 File –>Settings 或 ...
- UINavigationController 和 UITabBarController
UINavigationController当设置根控制器的时候,意思就是把根控制器压入栈内,当我们push的时候,我们把下一个控制器压入栈内,当我们pop的时候把上面的控制器的内存释放 UITa ...
- Java并发编程之volatile变量
volatile提供了弱同步机制,用来确保将变量更新通知到其它线程.volatile变量不会被缓存在寄存器中或者对其它处理器不可见的地方,因此在读取volatile变量时总会返回最新写入的值.可以想象 ...
- Java三大特征之多态(三)
面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...
- JS 中刷新页面的方法
整理了就是这几种,,有些在IE下面是不支持的,慎用... 1,history.go(0) 2,location.reload() 3,location=location 4,location.assi ...