大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出"NO"。

Input

三个整数 : S 可乐的体积 , N 和 M是两个杯子的容量,以"0 0 0"结束。

Output

如果能平分的话请输出最少要倒的次数,否则输出"NO"。

Sample Input

7 4 3
4 1 3
0 0 0

Sample Output

NO
3分析:这道题最终的状态就是三个里面只要有两个体积相等同时另一个为零即可,那么由于可能性很多并且步数繁杂,采用广搜是比较好的方法,虽然代码量大,但是基本思路都是重复的,大致思路就是把六种状态都遍历一遍就好了
import java.util.*;public class Main {static Scanner in = new Scanner(System.in);static final int maxn = 105;//标志数组来标记路径,三个杯子三维数组即可static int[][][] visited = new int[maxn][maxn][maxn];static void init() {for (int i = 0; i < maxn; ++i)for (int j = 0; j < maxn; ++j)for (int k = 0; k < maxn; ++k)visited[i][j][k] = 0;}// a b c为三个容器的最大容量static void bfs(int a, int b, int c) {if (a % 2 == 1) {System.out.println("NO");return;}Queue<Node> que = new LinkedList<Node>();// 初始que.add(new Node(a, 0, 0, 0));while (!que.isEmpty()) {// 取队头并弹出Node t = que.poll();visited[t.a][t.b][t.c] = 1;// 判断是否符合条件if (t.a == t.b && t.c == 0 || t.a == t.c && t.b == 0 || t.b == t.c && t.a == 0) {System.out.println(t.step);return;}// 倒水过程,注意倒水的前提是杯子里面有水// b -> aif (t.b != 0) {// 因为没有刻度, 所以每次倒水都有两种情况// 第一种情况是把自己倒完if (t.a + t.b <= a) {if (visited[t.a + t.b][0][t.c] == 0) {que.add(new Node(t.a + t.b, 0, t.c, t.step + 1));visited[t.a + t.b][0][t.c] = 1;}}// 第二种情况是把对方倒满else if (t.a != a) {if (visited[a][t.b - (a - t.a)][t.c] == 0) {que.add(new Node(a, t.b - (a - t.a), t.c, t.step + 1));visited[a][t.b - (a - t.a)][t.c] = 1;}}}// c -> aif (t.c != 0) {if (t.a + t.c <= a) {if (visited[t.a + t.c][t.b][0] == 0) {que.add(new Node(t.a + t.c, t.b, 0, t.step + 1));visited[t.a + t.c][t.b][0] = 1;}} else if (t.a != a) {if (visited[a][t.b][t.c - (a - t.a)] == 0) {que.add(new Node(a, t.b, t.c - (a - t.a), t.step + 1));visited[a][t.b][t.c - (a - t.a)] = 1;}}}// b -> cif (t.b != 0) {if (t.b + t.c <= c) {if (visited[t.a][0][t.b + t.c] == 0) {que.add(new Node(t.a, 0, t.b + t.c, t.step + 1));visited[t.a][0][t.b + t.c] = 1;}} else if (t.c != c) {if (visited[t.a][t.b - (c - t.c)][c] == 0) {que.add(new Node(t.a, t.b - (c - t.c), c, t.step + 1));visited[t.a][t.b - (c - t.c)][c] = 1;}}}// c -> bif (t.c != 0) {if (t.c + t.b <= b) {if (visited[t.a][t.c + t.b][0] == 0) {que.add(new Node(t.a, t.c + t.b, 0, t.step + 1));visited[t.a][t.c + t.b][0] = 1;}} else if (t.b != b) {if (visited[t.a][b][t.c - (b - t.b)] == 0) {que.add(new Node(t.a, b, t.c - (b - t.b), t.step + 1));visited[t.a][b][t.c - (b - t.b)] = 1;}}}// a -> bif (t.a != 0) {if (t.a + t.b <= b) {if (visited[0][t.a + t.b][t.c] == 0) {que.add(new Node(0, t.a + t.b, t.c, t.step + 1));visited[0][t.a + t.b][t.c] = 1;}} else if (t.b != b) {if (visited[t.a - (b - t.b)][b][t.c] == 0) {que.add(new Node(t.a - (b - t.b), b, t.c, t.step + 1));visited[t.a - (b - t.b)][b][t.c] = 1;}}}// a -> cif (t.a != 0) {if (t.a + t.c <= c) {if (visited[0][t.b][t.a + t.c] == 0) {que.add(new Node(0, t.b, t.a + t.c, t.step + 1));visited[0][t.b][t.a + t.c] = 1;}} else if (t.c != c) {if (visited[t.a - (c - t.c)][t.b][c] == 0) {que.add(new Node(t.a - (c - t.c), t.b, c, t.step + 1));visited[t.a - (c - t.c)][t.b][c] = 1;}}}}System.out.println("NO");}public static void main(String[] args) {while (in.hasNext()) {int a = in.nextInt(), b = in.nextInt(), c = in.nextInt();if (a == 0 && b == 0 && c == 0)break;init();bfs(a, b, c);}}}class Node {// a b c 代表实际拥有水的体积int a, b, c, step;Node(int a, int b, int c, int step) {this.a = a;this.b = b;this.c = c;this.step = step;}
}

G - 非常可乐--重复广搜相关推荐

  1. 可重复广搜 —— NYOJ 999 师傅又被妖怪抓走了

    对应 NYOJ 题目:点击打开链接 师傅又被妖怪抓走了 时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 3 描述 话说唐僧复得了孙行者,师徒们一心同体,共诣西方.自宝象国救了 ...

  2. 图论 用广搜搜邻接矩阵

    用广搜搜邻接矩阵 只是从某一点开始搜,如果是遍历全图的话就每个顶点挨个搜一遍 #include<stdio.h> #include<string.h> #include< ...

  3. G - 水陆距离 HihoCoder - 1478(广搜+队列先进先出性质)

    题目: 给定一个N x M的01矩阵,其中1表示陆地,0表示水域.对于每一个位置,求出它距离最近的水域的距离是多少. 矩阵中每个位置与它上下左右相邻的格子距离为1. Input 第一行包含两个整数,N ...

  4. 深搜DFS\广搜BFS 图初步入门

    首先,不管是BFS还是DFS,由于时间和空间的局限性,它们只能解决数据量比较小的问题. 深搜,顾名思义,它从某个状态开始,不断的转移状态,直到无法转移,然后退回到上一步的状态,继续转移到其他状态,不断 ...

  5. 深搜、广搜、搜索剪枝

    搜索与回溯讲解 文章目录 深搜 方向向量: DFS代码: 题目讲解: 八皇后问题 字符序列 自然数的拆分 广搜 BFS代码: 题目讲解: 瓷砖 关系网络 bfs与dfs的用途与区别 搜索剪枝 可行性剪 ...

  6. 深搜广搜专题【DFS】【BFS】

    深搜广搜专题 又是一年专题时,这次的专题是BFS和DFS,我们刚加入acm时的噩梦,然而现在已经写起来很舒服了(OS:那你还A不出题?) BFS和DFS都是通过对所有的点进行遍历来得到结果的,是一种比 ...

  7. Go 分布式学习利器(15) -- Go 实现 深搜和广搜

    强化语法,回顾算法. 通过Go语言实现 深度优先搜索 和 广度优先搜索,来查找社交网络中的三度好友关系(三度指的是一个节点到 其相邻节点 到 其相邻节点的节点 ,图递增三层好友关系). 涉及到的Go语 ...

  8. [NC23486]小A与小B 双向广搜

    题解:这个题属于走迷宫类型问题的一个升级版吧,不同之处在于一秒钟小A走一步,小B可以走两步,这两种事件是同时发生的,所以我们每秒钟让A扩散一步,让B扩散两步. 两个人走过的路径分别用 visited[ ...

  9. 八数码 poj 1077 广搜 A* IDA*

    经典的八数码问题,有人说不做此题人生不完整,哈哈. 状态总数是9! = 362880 种,不算太多,可以满足广搜和A*对于空间的需求. 状态可以每次都动态生成,也可以生成一次存储起来,我用的动态生成, ...

最新文章

  1. 狄利克雷卷积_一些狄利克雷卷积性质的证明
  2. C语言结构体与联合体
  3. activemq 控制台怎么看生产信息_Jmeter中间件处理-ActiveMQ
  4. java正则表达式去除xml标签之间的空格_HTML解析器——htmlparser2使用详解,换个姿势解析html和xml
  5. 三维坐标 偏转_三维坐标变换原理-平移, 旋转, 缩放
  6. Java8中的foreach跳出循环break/return
  7. cdn搭建原理_直播平台搭建并不难,最难的是这两点
  8. H2介绍 – Java嵌入式数据库
  9. STM32应用(三)一阶卡尔曼滤波原理和ADC读取红外测距模块的数值
  10. 虚拟现实技术虚拟校园解决方案
  11. 多智时代,人工智能发展历史的时间表
  12. uni-app打包成Android Apk 全程详解
  13. IE11浏览器缓存bug
  14. 打印机与计算机接口大多数,打印机接口-西北师范大学.PPT
  15. 项目一. 家庭记账软件
  16. 【数据可视化】python/pyecharts 画地图(热力图)(世界地图,省市地图,区县地图)、动态流向图
  17. 设计模式-行为型模式,状态模式(14)
  18. 引起C运行时错误R6034的原因和解决方法
  19. JavaGuide-关于Dubbo的重要知识点
  20. JCL 和 SLF4J

热门文章

  1. hadoop全家桶部署手册hadoop-solr-ranger-atlas-hive-hbase...
  2. 基于spark的Scala编程—读取properties文件
  3. Webflux异常处理
  4. 博学谷python_2020年最新博学谷Python基础班,资源教程下载
  5. selenium实现拉钩爬虫
  6. 英汉词典 JaVa_Java案例_英汉字典_技术文章
  7. 2021年京东撸货还能做吗?轻松实现利益最大化,新手必看!
  8. 如何享受人生,享受工作-读书笔记-得你所想、享你所得
  9. 初中计算机的组成试讲教案模板小学语文,小学语文面试试讲教案万能模板
  10. 关于人工智能,你知道怎么学吗