洛谷 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 那么这里有个优化,不然会超时 因为每次加的目的 ...
随机推荐
- Java CookieUtils
Java CookieUtils /** * <html> * <body> * <P> Copyright 1994 JsonInternational</ ...
- Deploy custom service on non hadoop node with Apache Ambari
1 I want to deploy a custom service onto non hadoop nodes using Apache Ambari. I have created a cu ...
- go install -v github.com/gopherjs/gopherjs报错提示go cannot find package "golang.org/x/crypto/ssh/terminal" 解决方案
1前言 方法一:go get 方法二: github clone 2 方法方法一:go get go get golang.org/x/crypto/ssh/terminal 但是这种方法容易被墙,出 ...
- python 1.使用djano前的提前准备:虚拟环境 virtualenv
首先想要学习django我们就得了解一下虚拟环境,什么是虚拟环境?他有什么用? 1.首先虚拟环境就相当于一个一个的盒子,这个盒子里面安装的软件不会对其他的盒子造成任何影响. 2.如果你现在用Djang ...
- python安装和pycharm安装与笔记
目录 计算机的基础知识 python安装和使用 pycharm安装和使用 [TOC] 计算机的基础知识 计算机是由什么组成的 cpu-----大脑 主板----身体 电源----心脏 内存----临时 ...
- k8s--yml文件3
- react diff
传统diff 通过循环递归对节点的依次对比,复杂度是O(n3) react diff react对传统diff进行了优化,将复杂度降为O(n) react基于这几个前提对diff进行了优化: 忽略跨层 ...
- JavaScript: 详解正则表达式之二
在上一篇文章中我们讲了正则表达式的基本用法,接下来博主想聊聊其中的细节,今天就从正则修饰符开始吧. 正则修饰符又称为正则标记(flags),它会对正则的匹配规则做限定,进而影响匹配的最终结果.在上次的 ...
- 交换机 VLAN 的划分
交换机怎么划分VLAN?本次的实验很简单,就是通过VLAN的划分,使不同VLAN之间无法通信,但是相同VLAN不受影响. 实验拓扑 在一台交换机下连接三台VPC,划分VLAN,地址规划如下: 名称 接 ...
- Spring Boot 配置多源的 RabbitMQ
简介 MQ 是开发中很平常的中间件,本文讲述的是怎么在一个Spring Boot项目中配置多源的RabbitMQ,这里不过多的讲解RabbitMQ的相关知识点.如果你也有遇到需要往多个RabbitMQ ...