洛谷 P1432 倒水问题
题目
思路
\(bfs\)
第一遍提交\(50\),第二遍就\(100\)了,qwq
\(Code\)
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
using namespace std;
int t,ca,cb,n,step,sum;
int a_now[100001],b_now[100001],flag[100001];//a_now、b_now分别记录a、b壶中的水,flag判断当前这一步是从哪里扩展来的
int ans[100001],qwq[100001];//ans存储进行了哪一步操作,qwq是最后的答案
bool vis[1001][1001];//判断是否到达过当前情况
inline int read(){
int x=0;bool f=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=!f;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return f?-x:x;
}//读优
inline void write(int x){
if(x<0) putchar('-'),write(-x);
else {if(x/10)write(x/10);putchar(x%10+'0');}
}//输出
void js(int x){
if(flag[x]){
js(flag[x]),step++;
qwq[++sum]=ans[x];
}
return;
}//计算用了几步以及分别是那几步
void bfs(int a,int b){
int head=0,tail=1;
flag[tail]=0;
a_now[tail]=a;
b_now[tail]=b;
vis[a][b]=1;
while(head<tail){
head++;
for(register int i=1;i<=6;++i){
if(i==1){
int c=ca,d=b_now[head];
if(!vis[c][d]){
vis[c][d]=1;
tail++,ans[tail]=i;
a_now[tail]=c,b_now[tail]=d;
flag[tail]=head;
if(d==n){js(tail);return;}
}
}//1操作:fillA 意为给A灌满水
if(i==2){
int c=a_now[head],d=cb;
if(!vis[c][d]){
vis[c][d]=1;
tail++,ans[tail]=i;
a_now[tail]=c,b_now[tail]=d;
flag[tail]=head;
if(d==n){js(tail);return;}
}
}//2操作:fill B
if(i==3){
int c=0,d=b_now[head];
if(!vis[c][d]){
vis[c][d]=1;
tail++,ans[tail]=i;
a_now[tail]=c,b_now[tail]=d;
flag[tail]=head;
if(d==n){js(tail);return;}
}
}//3操作:empty A 意为将A中水倒空
if(i==4){
int c=a_now[head],d=0;
if(!vis[c][d]){
vis[c][d]=1;
tail++,ans[tail]=i;
a_now[tail]=c,b_now[tail]=d;
flag[tail]=head;
if(d==n){js(tail);return;}
}
}//4操作:empty B
if(i==5){
int c,d,cha=ca-a_now[head];
if(cha>=b_now[head]) d=0,c=a_now[head]+b_now[head];
else c=ca,d=b_now[head]-cha;
if(!vis[c][d]){
vis[c][d]=1;
tail++,ans[tail]=i;
a_now[tail]=c,b_now[tail]=d;
flag[tail]=head;
if(d==n){
js(tail);
return;
}
}
}//5操作:pour BA 意为将B中水倒到A中(直到A满或者B中水没有剩余)
if(i==6){
int c,d;
int cha=cb-b_now[head];
if(cha>=a_now[head]) c=0,d=b_now[head]+a_now[head];
else c=a_now[head]-cha,d=cb;
if(!vis[c][d]){
vis[c][d]=1;
tail++,ans[tail]=i;
a_now[tail]=c;
b_now[tail]=d;
flag[tail]=head;
if(d==n){
js(tail);
return;
}
}
}//6操作:pour A B
}
}
}
int main(){
t=read();
while(t--){
ca=read(),cb=read(),n=read();
bfs(0,0);//搜索
printf("%d ",step);//输出有几步
for(register int i=1;i<=step;++i){//输出答案
write(qwq[i]);
printf(" ");
//printf("%d ",qwq[i]);
}
puts("");//换行
step=sum=0;
memset(vis,0,sizeof(vis));//初始化
}
return 0;
}
洛谷 P1432 倒水问题的更多相关文章
- 洛谷P1432 倒水问题(CODEVS.1226)
To 洛谷.1432 倒水问题 题目背景 In the movie "Die Hard 3", Bruce Willis and Samuel L. Jackson were co ...
- 洛谷P1432 倒水问题
题目背景 In the movie "Die Hard 3", Bruce Willis and Samuel L. Jackson were confronted with th ...
- 洛谷 P1582 倒水 解题报告
P1582 倒水 题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把 ...
- 洛谷P1582 倒水
P1582 倒水 题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把 ...
- 洛谷P1582 倒水 二进制 lowbit __builtin_popcount
P1582 倒水:https://www.luogu.org/problemnew/show/P1582 题意: 给定n瓶装有1升的水瓶,每次可以把两瓶装水量相同的水和成一瓶,问最少还要增加几瓶装有1 ...
- 洛谷P1582 倒水题解
题目 分析 这个题并不难,只是需要仔细思考我们首先可以很轻松的把这个题给疏通一下题意. 1:首先我们最后每个瓶子中装的水一定是一个$2^x$,因为每次都是$2$倍的加,这个应该很好理解. 2:我们要明 ...
- 洛谷 - P1582 - 倒水 - 位运算
https://www.luogu.org/problemnew/show/P1582 要求用最少的瓶子,那肯定不能有两个一样的瓶子,否则合并更优. 枚举其二进制位,每次加上lowbit,将最后一个1 ...
- 洛谷 P1582 倒水
题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒 ...
- 洛谷 P1582 倒水 (二进制)
这道题实际上是考二进制 很容易看出杯子水量一定是2的i次方 所以n杯水最后剩下的水一定是n用二进制表示中1的个数 所以就枚举n来求什么时候1的个数小于k 那么这里有个优化,不然会超时 因为每次加的目的 ...
随机推荐
- OpenResty部署nginx及nginx+lua
因为用nginx+lua去开发,所以会选择用最流行的开源方案,就是用OpenResty nginx+lua打包在一起,而且提供了包括redis客户端,mysql客户端,http客户端在内的大量的组件 ...
- Java 中文转换拼音工具
Java 中文转换拼音工具 /** * <html> * <body> * <P> Copyright 1994 JsonInternational</p&g ...
- 1+X证书学习日志——javascript基础
js javascript js的组成: ECMAscript DOM BOM js放置的位置 <script></script> <script src="路 ...
- Kali 2019(debian linux)安装MySql5.7.x
Kali 2019(debian linux)安装MySql5.7.x MySQL安装 确认是否安装MySQL 终端输入:mysql 如出现Welcome to the MariaDB monitor ...
- js 数组去重求和 (转载)
方法一:js数组id去重,value值相加问题 来源:https://www.jianshu.com/p/8f79e31b46ed // js let arr = [ { id: 1, value: ...
- Mysql 库表操作初识
Mysql 库表操作初识 终端登录mysql 这里只演示win下, cmd 终端. 至于怎么在win下, linux, mac安装, 感觉这是一个入门级的百度搜索问题, 安装都搞不定, 确实有点尴尬, ...
- JavaScript: 数据类型检测
由于JavaScript是门松散类型语言,定义变量时没有类型标识信息,并且在运行期可以动态更改其类型,所以一个变量的类型在运行期是不可预测的,因此,数据类型检测在开发当中就成为一个必须要了解和掌握的知 ...
- Class.getDeclaredFields()和Class.getFields()的区别。 Class.getMethods()和Class.getDeclaredMethods()的区别。
package www.cn.extend; /** Animal * 2019/07/04 * @author Administrator * */ public class Animal { pu ...
- nodejs 删除空文件
var fs = require("fs") var path = require("path") var listRealPath = path.resolv ...
- 【HICP Gauss】数据库 数据库管理(shutdown 日志 连接命令)-5
数据库关闭终止Zengine进程关闭数据库 会导致无法预料的状态 建议shutdown关闭数据库 shutdown 模式1.normal默认 停止新请求 断开等待会话 关闭服务 终止主进程 需要连接发 ...