UVA10603Fill题解--BFS
题目链接
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的更多相关文章
- UVA10603-Fill(BFS)
		
Problem UVA10603-Fill Accept:1162 Submit:10693 Time Limit: 3000 mSec Problem Description There are ...
 - Leetcode题解 - BFS部分题目代码+思路(896、690、111、559、993、102、103、127、433)
		
和树有关的题目求深度 -> 可以利用层序遍历 -> 用到层序遍历就想到使用BFS 896. 单调数列 - 水题 class Solution: def isMonotonic(self, ...
 - CodeForces CF877D题解(BFS+STL-set)
		
解法\(1:\) 正常的\(bfs\)剪枝是\(\Theta(nm4k)\),这个时间复杂度是只加一个\(vis\)记录的剪枝的,只能保证每个点只进队一次,并不能做到其他的减少时间,所以理论上是过不了 ...
 - 【POJ 2251】Dungeon Master(bfs)
		
BUPT2017 wintertraining(16) #5 B POJ - 2251 题意 3维的地图,求从S到E的最短路径长度 题解 bfs 代码 #include <cstdio> ...
 - 【ZOJ2276】Lara Croft(bfs)
		
BUPT2017 wintertraining(16) #4 D ZOJ - 2276 题意 n个数字绕成环,有两个指示数字的方块,每次可以顺时针或逆时针移动其中一个,步数是它当前位置的数字a[i], ...
 - 【bzoj4602】[Sdoi2016]齿轮  BFS
		
题目描述 给出一张n个点m条边的有向图,每条边 (u,v,x,y) 描述了 u 的点权乘 x 等于 v 的点权乘 y (点权可以为负).问:是否存在满足条件的图. 输入 有多组数据,第一行给定整数T, ...
 - 【bzoj1616】[Usaco2008 Mar]Cow Travelling游荡的奶牛  bfs
		
题目描述 奶牛们在被划分成N行M列(2 <= N <= 100; 2 <= M <= 100)的草地上游走,试图找到整块草地中最美味的牧草.Farmer John在某个时刻看见 ...
 - 【bzoj1189】[HNOI2007]紧急疏散evacuate  BFS最短路+动态加边网络流
		
题目描述 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一扇门,人们可以 ...
 - 【bzoj4242】水壶  BFS+最小生成树+倍增LCA
		
题目描述 JOI君所居住的IOI市以一年四季都十分炎热著称. IOI市是一个被分成纵H*横W块区域的长方形,每个区域都是建筑物.原野.墙壁之一.建筑物的区域有P个,编号为1...P. JOI君只能进入 ...
 
随机推荐
- OpenCL如何获取最小线程并行粒度
			
由于OpenCL是为各类处理器设备而打造的开发标准的计算语言.因此跟CUDA不太一样的是,其对设备特征查询的项更上层,而没有提供一些更为底层的特征查询.比如,你用OpenCL的设备查询API只能获取最 ...
 - python之scrapy爬取某集团招聘信息以及招聘详情
			
1.定义爬取的字段items.py # -*- coding: utf-8 -*- # Define here the models for your scraped items # # See do ...
 - ajax的回调函数
			
ajax的回调函数(done,fail,always) 观看代码: $.ajax({ type: "post",//请求的类型 url: "/book/detail?ac ...
 - harber私有镜像仓库(4)
			
一.部署准备: 准备harbor软件包 在部署节点上: #mv harbor-offline-installer-v1.4.0.tgz /opt/ && cd /opt #tar zx ...
 - Python实现的寻找前5个默尼森数算法示例
			
Python实现的寻找前5个默尼森数算法示例 本文实例讲述了Python实现的寻找前5个默尼森数算法.分享给大家供大家参考,具体如下: 找前5个默尼森数. 若P是素数且M也是素数,并且满足等式M=2* ...
 - dtcms  手机浏览
			
private string GetSitePath(string webPath, string requestPath, string requestDomain) { //获取当前域名包含的站点 ...
 - 3年磨一剑,我的前端数据 mock 库 http-mock-middleware
			
不好意思,离开博客园4年多了,一回来就是为自己打广告,真是害羞啊... http-mock-middleware 是我最近完成的一个前端数据 mock 库.它是我汇总近3年工作经验而诞生的一个工具,使 ...
 - docker 导出多个镜像合并成一个tar
			
导出单个镜像 docker save [images] > [name.tar] 倒出多个镜像合并成一个tar包 docker save [images] [images] > [name ...
 - VMware一些概念
			
物理机:真真实实存在的机器,有操作系统.内存.硬盘.网卡. 虚拟机:vmware虚拟出来的,和物理机一样有操作系统.内存.硬盘.网卡. 虚拟机的网络连接的桥接模式.NAT模式.仅主机模式简单解说: ...
 - 记录解决一个项目中遇到的maven打包问题
			
拿到同时给的代码,进行打jar包,这个jar包依赖一个第三方的jar包,一开始用IDEA打出来的包,没有把依赖的包打进去,后来查了相关的资料, 发现需要在maven的pom中添加相关的maven插件, ...