题目

思路

\(bfs\)

第一遍提交\(50\),第二遍就\(100\)了,qwq

\(Code\)

  1. #include<iostream>
  2. #include<cstring>
  3. #include<string>
  4. #include<algorithm>
  5. #include<cstdio>
  6. using namespace std;
  7. int t,ca,cb,n,step,sum;
  8. int a_now[100001],b_now[100001],flag[100001];//a_now、b_now分别记录a、b壶中的水,flag判断当前这一步是从哪里扩展来的
  9. int ans[100001],qwq[100001];//ans存储进行了哪一步操作,qwq是最后的答案
  10. bool vis[1001][1001];//判断是否到达过当前情况
  11. inline int read(){
  12. int x=0;bool f=0;char c=getchar();
  13. while(c<'0'||c>'9'){if(c=='-')f=!f;c=getchar();}
  14. while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
  15. return f?-x:x;
  16. }//读优
  17. inline void write(int x){
  18. if(x<0) putchar('-'),write(-x);
  19. else {if(x/10)write(x/10);putchar(x%10+'0');}
  20. }//输出
  21. void js(int x){
  22. if(flag[x]){
  23. js(flag[x]),step++;
  24. qwq[++sum]=ans[x];
  25. }
  26. return;
  27. }//计算用了几步以及分别是那几步
  28. void bfs(int a,int b){
  29. int head=0,tail=1;
  30. flag[tail]=0;
  31. a_now[tail]=a;
  32. b_now[tail]=b;
  33. vis[a][b]=1;
  34. while(head<tail){
  35. head++;
  36. for(register int i=1;i<=6;++i){
  37. if(i==1){
  38. int c=ca,d=b_now[head];
  39. if(!vis[c][d]){
  40. vis[c][d]=1;
  41. tail++,ans[tail]=i;
  42. a_now[tail]=c,b_now[tail]=d;
  43. flag[tail]=head;
  44. if(d==n){js(tail);return;}
  45. }
  46. }//1操作:fillA 意为给A灌满水
  47. if(i==2){
  48. int c=a_now[head],d=cb;
  49. if(!vis[c][d]){
  50. vis[c][d]=1;
  51. tail++,ans[tail]=i;
  52. a_now[tail]=c,b_now[tail]=d;
  53. flag[tail]=head;
  54. if(d==n){js(tail);return;}
  55. }
  56. }//2操作:fill B
  57. if(i==3){
  58. int c=0,d=b_now[head];
  59. if(!vis[c][d]){
  60. vis[c][d]=1;
  61. tail++,ans[tail]=i;
  62. a_now[tail]=c,b_now[tail]=d;
  63. flag[tail]=head;
  64. if(d==n){js(tail);return;}
  65. }
  66. }//3操作:empty A 意为将A中水倒空
  67. if(i==4){
  68. int c=a_now[head],d=0;
  69. if(!vis[c][d]){
  70. vis[c][d]=1;
  71. tail++,ans[tail]=i;
  72. a_now[tail]=c,b_now[tail]=d;
  73. flag[tail]=head;
  74. if(d==n){js(tail);return;}
  75. }
  76. }//4操作:empty B
  77. if(i==5){
  78. int c,d,cha=ca-a_now[head];
  79. if(cha>=b_now[head]) d=0,c=a_now[head]+b_now[head];
  80. else c=ca,d=b_now[head]-cha;
  81. if(!vis[c][d]){
  82. vis[c][d]=1;
  83. tail++,ans[tail]=i;
  84. a_now[tail]=c,b_now[tail]=d;
  85. flag[tail]=head;
  86. if(d==n){
  87. js(tail);
  88. return;
  89. }
  90. }
  91. }//5操作:pour BA 意为将B中水倒到A中(直到A满或者B中水没有剩余)
  92. if(i==6){
  93. int c,d;
  94. int cha=cb-b_now[head];
  95. if(cha>=a_now[head]) c=0,d=b_now[head]+a_now[head];
  96. else c=a_now[head]-cha,d=cb;
  97. if(!vis[c][d]){
  98. vis[c][d]=1;
  99. tail++,ans[tail]=i;
  100. a_now[tail]=c;
  101. b_now[tail]=d;
  102. flag[tail]=head;
  103. if(d==n){
  104. js(tail);
  105. return;
  106. }
  107. }
  108. }//6操作:pour A B
  109. }
  110. }
  111. }
  112. int main(){
  113. t=read();
  114. while(t--){
  115. ca=read(),cb=read(),n=read();
  116. bfs(0,0);//搜索
  117. printf("%d ",step);//输出有几步
  118. for(register int i=1;i<=step;++i){//输出答案
  119. write(qwq[i]);
  120. printf(" ");
  121. //printf("%d ",qwq[i]);
  122. }
  123. puts("");//换行
  124. step=sum=0;
  125. memset(vis,0,sizeof(vis));//初始化
  126. }
  127. return 0;
  128. }

洛谷 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. Spring mvc请求处理流程详解(一)之视图解析

      本文链接:https://blog.csdn.net/lchpersonal521/article/details/53112728 前言 Spring mvc框架相信很多人都很熟悉了,关于这方面 ...

  2. Ambari深入学习(II)-实现细节

    在第一节中,我们简单讲了一下Ambari的系统架构.我们这一节主要分析Ambari的源代码,总览Ambari的具体实现方式及其工作细节. 一.Ambari-Server启动 Ambari-Server ...

  3. AspNetCore MVC页面数据提交验证

    2019/05/14,AspNetCore 2.2.0 摘要:AspNetCore MVC使用数据注释配合jquery.validate提交页面进行前端加后端的数据验证 主要用到了jquery.val ...

  4. react-router4的使用备注

    1.安装 react-router是核心库,在项目中不需要安装,web开发只需安装react-router-dom.native开发安装react-router-native. 2.url参数携带与获 ...

  5. Flask 和 Django 框架的区别

    1)Flask Flask确实很“轻”,不愧是Micro Framework,从Django转向Flask的开发者一定会如此感慨,除非二者均为深入使用过 Flask自由.灵活,可扩展性强,第三方库的选 ...

  6. Flink入门 - CoGroup和Join

    /* *CoGroup */ final StreamExecutionEnvironment streamExecutionEnvironment = StreamExecutionEnvironm ...

  7. EF执行存储过程(转载)

    https://blog.csdn.net/xiaouncle/article/details/82914255 相关文章: https://www.cnblogs.com/Coder-ru/arch ...

  8. 如何在Win7电脑上增加新磁盘分区?

    原文链接: https://www.cnblogs.com/haoxitong/p/9405497.html 我们在重装好系统Win7系统后有时会碰到需要新建磁盘分区的情况,这时我们再重装系统进行磁盘 ...

  9. Gerrit服务器权限管理

    Gerrit服务器权限管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Gerrit权限概述 1>.对象 Gerrit识别单个或多个人员集合. Gerrit不允许使用单 ...

  10. js插件---webuploader 使用(lavarel中使用)

    js插件---webuploader 使用(lavarel中使用) 一.总结 一句话总结: 多去看几个具体使用的实例,很多blog教程都有坑,多看几个交叉印证可以没那么多坑 1.webuploader ...