给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。

 

Input

第一行一个整数N(0<N<50)表示N组测试数据
接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的体积。
第二行给出三个整数E1 E2 E3 (体积小于等于相应水杯体积)表示我们需要的最终状态

 

Output

每行输出相应测试数据最少的倒水次数。如果达不到目标状态输出-1

 

Sample Input

  1. 2
  2. 6 3 1
  3. 4 1 1
  4. 9 3 2
  5. 7 1 1

Sample Output

  1. 3
  2. -1
  3.  
  1. #include <vector>
  2. #include <map>
  3. #include <set>
  4. #include <algorithm>
  5. #include <iostream>
  6. #include <cstdio>
  7. #include <cmath>
  8. #include <cstdlib>
  9. #include <string>
  10. #include <cstring>
  11. #include <queue>
  12. using namespace std;
  13.  
  14. int s1,s2,s3;
  15. bool vis[][][];
  16.  
  17. struct node
  18. {
  19. int a,b,c;
  20. int bu;
  21. }x,y;
  22.  
  23. int bfs()
  24. {
  25. queue<node> q;
  26. while(!q.empty())
  27. q.pop();
  28. q.push(x);
  29. while(!q.empty()){
  30. node r=q.front();
  31. q.pop();
  32. vis[r.a][r.b][r.c]=true;
  33. if(r.a==y.a&&r.b==y.b&&r.c==y.c) return r.bu;
  34.  
  35. if(<r.a && r.b<s2){
  36. node t=r;
  37. int tt=min(t.a,s2-t.b);
  38. t.a-=tt;
  39. t.b+=tt;
  40. if(vis[t.a][t.b][t.c]==false){
  41. vis[t.a][t.b][t.c]=true;
  42. t.bu++;
  43. q.push(t);
  44. }
  45. }
  46.  
  47. if(<r.a && r.c<s3){
  48. node t=r;
  49. int tt=min(t.a,s3-t.c);
  50. t.a-=tt;
  51. t.c+=tt;
  52. if(vis[t.a][t.b][t.c]==false){
  53. vis[t.a][t.b][t.c]=true;
  54. t.bu++;
  55. q.push(t);
  56. }
  57. }
  58.  
  59. if(<r.b && r.a<s1){
  60. node t=r;
  61. int tt=min(t.b,s1-t.a);
  62. t.b-=tt;
  63. t.a+=tt;
  64. if(vis[t.a][t.b][t.c]==false){
  65. vis[t.a][t.b][t.c]=true;
  66. t.bu++;
  67. q.push(t);
  68. }
  69. }
  70.  
  71. if(<r.b && r.c<s3){
  72. node t=r;
  73. int tt=min(t.b,s3-t.c);
  74. t.b-=tt;
  75. t.c+=tt;
  76. if(vis[t.a][t.b][t.c]==false){
  77. vis[t.a][t.b][t.c]=true;
  78. t.bu++;
  79. q.push(t);
  80. }
  81. }
  82.  
  83. if(<r.c && r.a<s1){
  84. node t=r;
  85. int tt=min(t.c,s1-t.a);
  86. t.c-=tt;
  87. t.a+=tt;
  88. if(vis[t.a][t.b][t.c]==false){
  89. vis[t.a][t.b][t.c]=true;
  90. t.bu++;
  91. q.push(t);
  92. }
  93. }
  94.  
  95. if(<r.c && r.b<s2){
  96. node t=r;
  97. int tt=min(t.c,s2-t.b);
  98. t.c-=tt;
  99. t.b+=tt;
  100. if(vis[t.a][t.b][t.c]==false){
  101. vis[t.a][t.b][t.c]=true;
  102. t.bu++;
  103. q.push(t);
  104. }
  105. }
  106. }
  107. return -;
  108. }
  109.  
  110. int main()
  111. {
  112. int n;
  113. scanf("%d",&n);
  114. while(n--){
  115. memset(vis,false,sizeof(vis));
  116. scanf("%d %d %d",&s1,&s2,&s3);
  117. x.a=s1,x.b=,x.c=,x.bu=;
  118. scanf("%d %d %d",&y.a,&y.b,&y.c);
  119. if(s1<y.a+y.b+y.c){
  120. printf("-1\n");
  121. continue;
  122. }
  123. else{
  124. printf("%d\n",bfs());
  125. }
  126. }
  127. }

三个水杯 (bfs)的更多相关文章

  1. nyoj三个水杯(bfs)

    三个水杯 时间限制:1000 ms  |           内存限制:65535 KB 难度:4   描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互 ...

  2. nyoj 21三个水杯(BFS + 栈)

    题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=21 思想: 看了一下搜索就来写了这题(BFS 找出最短路径 所以用此来进行搜索) 这题在 ...

  3. NYOJ 21.三个水杯-初始态到目标态的最少次数-经典BFS

    题目传送门:biubiubiu~ 三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子. ...

  4. NYOJ #21 三个水杯(bfs)

    描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标 ...

  5. 三个水杯(BFS)

    三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 给出三个水杯.大小不一,而且仅仅有最大的水杯的水是装满的,其余两个为空杯子. 三个水杯之间相互倒水,而且水杯 ...

  6. NYOJ 21 三个水杯

    三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有 ...

  7. 三个水杯——java,广度优先搜索

    题目如下: 21-三个水杯 内存限制:64MB 时间限制:1000ms 特判: No通过数:51 提交数:137 难度:4 题目描述: 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个 ...

  8. nyoj 三个水杯

    三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只 ...

  9. 26-三个水杯(bfs)

    三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有 ...

随机推荐

  1. [原创] linux 下上传 datapoint数据到yeelink 【golang版本】

    package main /* Create by sndnvaps<sndnvaps@gmail.com> * date : 2015-04-05 * upload datapoint ...

  2. Android SwipeRefreshLayout 官方下拉刷新控件介绍

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24521483 下面App基本都有下拉刷新的功能,以前基本都使用XListView ...

  3. PV操作——生产者和消费者

    首先,先来看几个概念: 同步:协作的过程,比如,多人开发合作. 相互排斥:争抢资源的过程.比如苦逼的大学选课: 临界区:进程中对临界资源实施操作的那段程序: 临界资源:一次仅仅能一个进程使用的资源,比 ...

  4. CKEditor上传插件

    CKEditor上传插件 前言 CKEditor上传插件是不是免费的,与您分享在此开发.这个插件是基于ASP.NET MVC下开发的,假设是webform的用户或者其他语言的用户.能够參考把serve ...

  5. [视频解说]0基础课程-运营商-Java它J2se

    本节解说 运营商应用 Java 算被分成: 算术运算符 颂值运营商 逻辑运算符 位运算符 元运算符 这里录制了 视频解说这几大类运算符,并有练习题提供大家 面试题: 1. 最有效率的方式算出2乘以8等 ...

  6. 02、Unicode 汉子转码小工具

    原文:02.Unicode 汉子转码小工具 在做 Windows app 的时候,与服务器端交互使用的是 json 格式的数据,里面的汉字内容被 编码成 unicode 格式,在调试的时候不太方便,就 ...

  7. IIS7构造Gzip压缩

    IIS7构造Gzip压缩 本文来自Kevin Yang博客 作者:Kevin Yang 开启配置HTTP压缩(GZip) 在IIS7中配置Gzip压缩相比IIS6来说实在easy了很多.并且默认情况下 ...

  8. Alamofire网络库进阶教程

    本章节由CocoaChina翻译组成员星夜暮晨(博客)翻译自raywenderlich:Intermediate Alamofire Tutorial,敬请勘误. 欢迎回到我们的 Alamofire ...

  9. 无显示仍然发挥树莓派——VNCserver设定

    谁说没有显示器就不能玩树莓派的图形界面了.不要忘了VNCserver哦! VNC(Virtual Network Computing)属于一种网络显示系统,也就是说它能将完整的窗体界面通过网络传输到还 ...

  10. Attribute(两)——定义自己的特色+Asp.net MVC中间filter详细解释

    部分博客是预先定义的有关特性的一些基本特征,同时还Attribute这一概念的一个宏观上的认识,在上篇博客结尾介绍了有关为自己定义特性服务的AttributeUsage,这篇博客主要是通过filter ...