题目

思路

\(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. 对于解决VS2015启动界面卡在白屏的处理方法

    有时候会遇到这种情况,仅供参考 找到devenv.exe所在文件夹,按住Shift,在空白地方右键,选择“在此处打开命令窗口”,在打开的窗口中输入devenv /ResetSettings 重新设置V ...

  2. mysql 5.7 非正常安装,无法启动 服务没有报告任何错误

    以前,完整安装mysql5.7程序时,由于程序太大,可以将安装缓存目录中的安装文件(较小)复制出来后,留以后使用. mysql--win32.msi 2 mysql-5.7.17-winx64.msi ...

  3. P2801 教主的魔法 (线段树)

    题目 P2801 教主的魔法 解析 成天做水题 线段树,第一问区间加很简单 第二问可以维护一个区间最大值和一个区间最小值,若C小于等于区间最小值,就加上区间长度,若C大于区间最大值,就加0 ps:求教 ...

  4. Python进阶(二)----函数参数,作用域

    Python进阶(二)----函数参数,作用域 一丶形参角度:*args,动态位置传参,**kwargs,动态关键字传参 *args: ​ 动态位置参数. 在函数定义时, * 将实参角度的位置参数聚合 ...

  5. Exception和RuntimeException区别

    Exception:强制性要求用户必须进行处理: RuntimeException:是Exception的子类,由用户选择是否进行处理:

  6. python基础之猜数字游戏

    #猜数字游戏 import random #impor语句导入random模块 guessor=0; print("#"*30) #输出30个”#“(”############## ...

  7. 归并排序python实现源码

    将开发过程经常用到的一些代码片段收藏起来,下面的资料是关于归并排序python实现的代码,应该能对码农们有一些用. def mergesort(arr): if len(arr) == 1: retu ...

  8. 详解Linux获取启动盘路径命令--fdisk、sfdisk -l、lsblk

    概述 linux引导磁盘路径可以用于任何问题的故障诊断.这个引导分区或路径包含GRUB配置的Linux引导装载程序.那么我们可以怎么找到当前Linux引导磁盘路径呢? 基本上有三种方法可以找到当前Li ...

  9. MySQL/MariaDB数据库的性能测试

      MySQL/MariaDB数据库的性能测试 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据库服务衡量指标 qps: query per second(每秒支持多少查询 ...

  10. linux查看redis安装目录

    1.在redis下查看安装目录 如果命令 which 和whereis 都找不到安装目录,可使用以下办法 ps -ef|grep redis 得到了进程号 xxxx 然后 ls -l /proc/xx ...