题目链接

https://cn.vjudge.net/problem/UVA-10603

分析

经典的倒水问题,直接BFS.

对于喜闻乐见的状态判重,一开始想来个哈希函数把一个三元组映射成一个数,后面发现数据很小直接三维数组,后面又发现总水量是固定值,直接二维\(bool\)数组就好了

然后每次取出状态更新下答案,搜索时就是枚举将哪个杯子的水倒入哪个杯子还是很好写的,记得要状态还原

忽然发现最近只会写写水题过活了

代码

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cctype>
#include <queue>
#define ll long long
#define ri register int
#define ull unsigned long long
using std::priority_queue;
using std::min;
using std::swap;
template <class T>inline void read(T &x){
x=0;int ne=0;char c;
while(!isdigit(c=getchar()))ne=c=='-';
x=c-48;
while(isdigit(c=getchar()))x=(x<<3)+(x<<1)+c-48;
x=ne?-x:x;return ;
}
const int maxn=205;
const int inf=0x7fffffff;
int ans=inf,step=0;
int a,b,c,d;
struct Sta{
int bot[3];
int sum;
Sta(){bot[0]=bot[1]=bot[2]=sum=0;}
Sta(int _x,int _y,int _z,int _sum){bot[0]=_x,bot[1]=_y,bot[2]=_z,sum=_sum;}
inline bool update(){
for(ri i=0;i<3;i++){
if(bot[i]>d)continue;
if(ans>d-bot[i]){
ans=d-bot[i];
step=sum;
}
}
if(!ans)return 1;
return 0;
}
bool operator <(const Sta &b)const{
return sum>b.sum;
}
}Tmp;
bool vis[205][205];
int size[3],now[3];
int t;
inline void bfs(){
memset(vis,0,sizeof(vis));
ans=inf,step=0;
priority_queue <Sta> q;
while(q.size())q.pop();
q.push(Sta(0,0,c,0));
vis[0][0]=1;
int x,y,z,lef,o,p;
while(q.size()){
Tmp=q.top();q.pop();
if(Tmp.update()){
printf("%d %d\n",Tmp.sum,d-ans);
return ;
}
now[0]=Tmp.bot[0],now[1]=Tmp.bot[1],now[2]=Tmp.bot[2],o=Tmp.sum;
for(ri i=0;i<3;i++){//i倒入j杯
for(ri j=0;j<3;j++){
if(!now[i]||size[j]==now[j]||i==j)continue;
lef=size[j]-now[j];
if(now[i]>=lef){
now[i]-=lef;
now[j]=size[j];
if(!vis[now[0]][now[1]]){
vis[now[0]][now[1]]=1;
q.push(Sta(now[0],now[1],now[2],o+lef));
}
now[i]+=lef;
now[j]-=lef;
}
else{
p=now[i];
now[i]=0;
now[j]+=p;
if(!vis[now[0]][now[1]]){
vis[now[0]][now[1]]=1;
q.push(Sta(now[0],now[1],now[2],o+p));
}
now[i]=p;
now[j]-=p;
}
}
}
}
printf("%d %d\n",step,d-ans);
return ;
}
int main(){
read(t);
while(t--){
read(a),read(b),read(c),read(d);
size[0]=a,size[1]=b,size[2]=c;
bfs();
}
return 0;
}

UVA10603Fill题解--BFS的更多相关文章

  1. UVA10603-Fill(BFS)

    Problem UVA10603-Fill Accept:1162  Submit:10693 Time Limit: 3000 mSec  Problem Description There are ...

  2. Leetcode题解 - BFS部分题目代码+思路(896、690、111、559、993、102、103、127、433)

    和树有关的题目求深度 -> 可以利用层序遍历 -> 用到层序遍历就想到使用BFS 896. 单调数列 - 水题 class Solution: def isMonotonic(self, ...

  3. CodeForces CF877D题解(BFS+STL-set)

    解法\(1:\) 正常的\(bfs\)剪枝是\(\Theta(nm4k)\),这个时间复杂度是只加一个\(vis\)记录的剪枝的,只能保证每个点只进队一次,并不能做到其他的减少时间,所以理论上是过不了 ...

  4. 【POJ 2251】Dungeon Master(bfs)

    BUPT2017 wintertraining(16) #5 B POJ - 2251 题意 3维的地图,求从S到E的最短路径长度 题解 bfs 代码 #include <cstdio> ...

  5. 【ZOJ2276】Lara Croft(bfs)

    BUPT2017 wintertraining(16) #4 D ZOJ - 2276 题意 n个数字绕成环,有两个指示数字的方块,每次可以顺时针或逆时针移动其中一个,步数是它当前位置的数字a[i], ...

  6. 【bzoj4602】[Sdoi2016]齿轮 BFS

    题目描述 给出一张n个点m条边的有向图,每条边 (u,v,x,y) 描述了 u 的点权乘 x 等于 v 的点权乘 y (点权可以为负).问:是否存在满足条件的图. 输入 有多组数据,第一行给定整数T, ...

  7. 【bzoj1616】[Usaco2008 Mar]Cow Travelling游荡的奶牛 bfs

    题目描述 奶牛们在被划分成N行M列(2 <= N <= 100; 2 <= M <= 100)的草地上游走,试图找到整块草地中最美味的牧草.Farmer John在某个时刻看见 ...

  8. 【bzoj1189】[HNOI2007]紧急疏散evacuate BFS最短路+动态加边网络流

    题目描述 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一扇门,人们可以 ...

  9. 【bzoj4242】水壶 BFS+最小生成树+倍增LCA

    题目描述 JOI君所居住的IOI市以一年四季都十分炎热著称. IOI市是一个被分成纵H*横W块区域的长方形,每个区域都是建筑物.原野.墙壁之一.建筑物的区域有P个,编号为1...P. JOI君只能进入 ...

随机推荐

  1. VS2015编译cef3-2357

    1.会遇到把警告当错误的情况 按照如下设置即可 2. 错误 C2334 “:”的前面有意外标记:跳过明显的函数体 (编译源文件 E:\cef_binary_3.2357.1271.g8e0674e_w ...

  2. 负载均衡 | Nginx+Tomcat 动静分离实现负载均衡

    0.前期准备 使用Debian环境.安装Nginx(默认安装),一个web项目,安装tomcat(默认安装)等. 1.一份Nginx.conf配置文件 基本配置这个文件,就可以实现负载了.但是里面的各 ...

  3. WordPress窗体化侧边栏

    窗体化侧边栏是一个支持 Widget 的侧边栏或者说是窗体化(widgetized)的侧边栏几乎是 WordPress 主题的标准. 首先,什么是窗体化(widgetizing)呢?简单的说,窗体化就 ...

  4. Graphics 使用一点点注意

    Form_Load 事件下绘制的结果会被 paint 刷新掉.也就等于没有绘制一样. Graphics g = this.CreateGraphics(); g.DrawRectangle(new P ...

  5. nginx 反向代理实现负载均衡*理论

    Nginx负载均衡集群介绍 负载均衡集群提供了一种廉价,有效,透明的方法,来扩展网络设备和服务器的负载,带宽和吞吐量,同时加强了网络数据处理能力,提高了网络的灵活性和可用性. 搭建负载均衡服务的需求: ...

  6. BrowserUtils

    import android.content.Context; import android.content.Intent; import android.net.Uri; public class ...

  7. Fragment入门代码

    让一个activity和加载多个布局文件 package com.example.fragment; import android.app.Activity; import android.app.F ...

  8. python之scrapy模拟登陆人人网

    1.settings.py主要配置信息,包括USER_AGENT等 # -*- coding: utf-8 -*- # Scrapy settings for renren project # # F ...

  9. 小D课堂 - 新版本微服务springcloud+Docker教程_5-01分布式核心知识之熔断、降级

    笔记: 第五章 互联网架构服务降级熔断 Hystrix 实战 1.分布式核心知识之熔断.降级讲解     简介:系统负载过高,突发流量或者网络等各种异常情况介绍,常用的解决方案 1.熔断:       ...

  10. Java日志体系(六)log4j2

    1.1 简介 log4j2,一个日志的实现框架,是log4j的升级版本,于2014年7月正式亮相.与第一代log4j不同,log4j2完全重写了log4j的日志实现,并不是在原有基础上进行的升级,解决 ...