题目

思路

\(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 倒水问题的更多相关文章

  1. 洛谷P1432 倒水问题(CODEVS.1226)

    To 洛谷.1432 倒水问题 题目背景 In the movie "Die Hard 3", Bruce Willis and Samuel L. Jackson were co ...

  2. 洛谷P1432 倒水问题

    题目背景 In the movie "Die Hard 3", Bruce Willis and Samuel L. Jackson were confronted with th ...

  3. 洛谷 P1582 倒水 解题报告

    P1582 倒水 题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把 ...

  4. 洛谷P1582 倒水

    P1582 倒水 题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把 ...

  5. 洛谷P1582 倒水 二进制 lowbit __builtin_popcount

    P1582 倒水:https://www.luogu.org/problemnew/show/P1582 题意: 给定n瓶装有1升的水瓶,每次可以把两瓶装水量相同的水和成一瓶,问最少还要增加几瓶装有1 ...

  6. 洛谷P1582 倒水题解

    题目 分析 这个题并不难,只是需要仔细思考我们首先可以很轻松的把这个题给疏通一下题意. 1:首先我们最后每个瓶子中装的水一定是一个$2^x$,因为每次都是$2$倍的加,这个应该很好理解. 2:我们要明 ...

  7. 洛谷 - P1582 - 倒水 - 位运算

    https://www.luogu.org/problemnew/show/P1582 要求用最少的瓶子,那肯定不能有两个一样的瓶子,否则合并更优. 枚举其二进制位,每次加上lowbit,将最后一个1 ...

  8. 洛谷 P1582 倒水

    题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒 ...

  9. 洛谷 P1582 倒水 (二进制)

    这道题实际上是考二进制 很容易看出杯子水量一定是2的i次方 所以n杯水最后剩下的水一定是n用二进制表示中1的个数 所以就枚举n来求什么时候1的个数小于k 那么这里有个优化,不然会超时 因为每次加的目的 ...

随机推荐

  1. 仅反射加载(ReflectionOnlyLoadFrom)的 .NET 程序集,如何反射获取它的 Attribute 元数据呢?

    原文:仅反射加载(ReflectionOnlyLoadFrom)的 .NET 程序集,如何反射获取它的 Attribute 元数据呢? 平时我们获取一个程序集或者类型的 Attribute 是非常轻松 ...

  2. C# vb .net实现玻璃桌子效果滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的玻璃桌子效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...

  3. jdk命令行工具系列

    虚拟机堆转储快照分析工具使用jmap等方法生成java的堆文件后jhat:虚拟机堆转储快照分析工具 导出程序执行的堆信息 jps jps -l jmap -dump:format=b,file=D:/ ...

  4. 【imx6ul应用开发】如何修改串口?

    4.1如何修改串口?答:开发板已经调好了串口驱动,调试串口,只需要修改dts文件即可,客户可以根据实际需要,确定硬件管脚具体用哪一个. 打开内核源代码/arch/arm/boot/dts/myb-y6 ...

  5. 【转载】C#中Convert.ToDecimal方法将字符串转换为decimal类型

    在C#编程过程中,可以使用Convert.ToDecimal方法将字符串或者其他可转换为数字的对象变量转换为十进制decimal类型,Convert.ToDecimal方法有多个重载方法,最常使用的一 ...

  6. python day19 : 购物商城作业,进程与多线程

    目录 python day 19 1. 购物商城作业要求 2. 多进程 2.1 简述多进程 2.2 multiprocessing模块,创建多进程程序 2.3 if name=='main'的说明 2 ...

  7. JavaScript之控制标签css

    控制标签css标签.style.样式='样式具体的值'如果样式出现中横线,如border-radius,将中横线去掉,中横线后面的单词首字母大写,写成borderRadius如果原来就要该样式,表示修 ...

  8. 基于MUI框架+HTML5PLUS 开发 iOS和Android 应用程序(APP)

    目录 事前准备 创建项目 利用MUI写一个简单的页面 关于文件打包 事前准备 # 软件 HBuilder X Web开发IDE 下载地址:https://www.dcloud.io/hbuilderx ...

  9. 一道经典面试题,atoi函数的实现

    参考资料 (1)atoi函数的实现 (2)<剑指offer> 题目分析 本题需要注意的有几个方面: (1)检查输入参数,指针是否为NULL: (2)去除字符串前面的空格 (3)处理正负符号 ...

  10. 【快捷键】印象笔记Markdown快捷键

    新建 Markdown 笔记 CMD+D 粗体 CMD+B 斜体 CMD+I 删除线 CMD+S 分隔线 CMD+L 编号列表 CMD+Shift+O 项目符号列表 CMD+Shift+U 插入待办事 ...