//广度优先搜索

// 2014-10-24

import java.util.ArrayList;

import java.util.HashSet;

import java.util.LinkedList;

import java.util.List;

import java.util.Queue;

import java.util.Scanner;

import java.util.Set;

public class Water {

int CA = 11; // 两个桶的容量

int CB = 4;

int dest = 3; // 目标

// 6个操作

String opName[] = { "装满A桶 ", "装满B桶 ", "清空A桶 ", "清空B桶 ",

"A中水倒入B", "B中水倒入A", };

// 搜索队列

Queue queue = new LinkedList();

// 结点

class Node {

int qa = 0;

int qb = 0;

@Override

public int hashCode() {

int ret = qa * 1024 + qb;

return ret;

}

@Override

public boolean equals(Object n){

Node nd = (Node)n;

return nd.qa == qa && nd.qb == qb;

}

}

// 带路径的结点

class PathNode extends Node {

List path = new ArrayList();

}

PathNode pnResult;

// 已访问结点

Set visited = new HashSet();

// 根据操作码进行操作

void operate(PathNode nd, int code) {

switch (code) {

case 0:

nd.qa = CA;

break;

case 1:

nd.qb = CB;

break;

case 2:

nd.qa = 0;

break;

case 3:

nd.qb = 0;

break;

case 4:

if (nd.qa <= CB - nd.qb) {

nd.qb += nd.qa;

nd.qa = 0;

} else {

nd.qa -= CB - nd.qb;

nd.qb = CB;

}

break;

case 5:

if (nd.qb <= CA - nd.qa) {

nd.qa += nd.qb;

nd.qb = 0;

} else {

nd.qb -= CA - nd.qa;

nd.qa = CA;

}

break;

}

nd.path.add(code);

}

// 成功

boolean success(Node nd) {

return nd.qa == dest || nd.qb == dest

|| (dest > nd.qa && dest > nd.qb && dest == nd.qa + nd.qb);

}

// 已访问

boolean visited(Node nd) {

return visited.contains(nd);

}

void search() {

PathNode pn = new PathNode();

queue.offer(pn);

visited.add(pn);

int status = 0; // 0搜索,1成功,2失败

while (status == 0) {

if (queue.isEmpty()) {

status = 2;

} else {

PathNode pnOld = queue.poll();

for (int i = 0; i <= 5; i++) {

PathNode pnNew = new PathNode();

pnNew.qa = pnOld.qa;

pnNew.qb = pnOld.qb;

pnNew.path.addAll(pnOld.path);

this.operate(pnNew, i);

if (success(pnNew)) {

status = 1;

pnResult = pnNew;

break;

} else if (!visited(pnNew)) {

visited.add(pnNew);

queue.offer(pnNew);

}

} // end of for

}

} // end of while

if (status == 1) {

print(pnResult);

} else {

System.out.println("无解");

}

}

void print(PathNode pn) {

PathNode pathResult = new PathNode();

for (Integer i : pn.path) {

this.operate(pathResult, i);

System.out.println(opName[i] + "\t\t\t--->" + pathResult.qa + ' '

+ pathResult.qb);

}

}

void input() {

System.out.println("依次输入A B桶的容量和目标水量,如6 5 3");

Scanner sc = new Scanner(System.in);

CA = sc.nextInt();

CB = sc.nextInt();

dest = sc.nextInt();

sc.close();

}

public static void main(String args[]) {

Water w = new Water();

w.input();

w.search();

}

}

一键复制

编辑

Web IDE

原始数据

按行查看

历史

java wate_Water.java相关推荐

  1. java unlimited_具有无限参数的Java方法(Java method with unlimited arguments)

    具有无限参数的Java方法(Java method with unlimited arguments) Spring框架使用方法,您可以根据需要传递尽可能多的参数. 我想写一个函数,也可以采取无限量的 ...

  2. 介绍java -cp java -jar的区别

    java -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,window上分号";" java -cp &am ...

  3. 【Java】Java连接Mysql数据库的demo示例

    [Java]Java连接Mysql数据库的demo示例 1.安装mysql数据库 2.下载java-mysql-connector.jar包 3.完成java配置 4.写java代码运行测试 1.安装 ...

  4. java抓取网页标题内容_[Java教程]java 网页页面抓取标题和正文

    [Java教程]java 网页页面抓取标题和正文 0 2014-07-10 09:01:30 import java.io.BufferedReader;import java.io.IOExcept ...

  5. Java基础-Java中的堆内存和离堆内存机制

    Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 转载于:https://www.cnblogs.com/yinzhengjie/p/9 ...

  6. Java 异常java.lang.IllegalArgumentException: Illegal group reference

    Java 异常java.lang.IllegalArgumentException: Illegal group reference 参考文章: (1)Java 异常java.lang.Illegal ...

  7. Java基础-JAVA中常见的数据结构介绍

    Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...

  8. 4.6 W 字总结!Java 11—Java 17特性详解

    作者 | 民工哥技术之路 来源 | https://mp.weixin.qq.com/s/SVleHYFQeePNT7q67UoL4Q Java 11 特性详解 基于嵌套的访问控制 与 Java 语言 ...

  9. 做了6年的Java,java视频教程传智播客

    JAVA基础 JAVA异常分类及处理 异常分类 异常的处理方式 Throw和throws的区别 JAVA反射 动态语言 反射机制概念 (运行状态中知道类所有的属性和方法) Java反射API 反射使用 ...

最新文章

  1. 深度学习前人精度很高了,该怎么创新?
  2. HTTP将死?又拍云布局HTTPS 护航网页安全加速
  3. ARM+linux+2440嵌入式开发相关经典书籍(转)
  4. spacevim 添加自动折行
  5. 2336: [HNOI2011]任务调度 - BZOJ
  6. P3302 SDOI2013森林
  7. LoadDruidSegmentStep failed File does not exist: /druid/segments
  8. 域外计算机访问域内共享,域外用户如何拥有让其他电脑加域或退域的权限
  9. GCC options总结
  10. win10 安装oracle11g R2的64位版本
  11. TeeChart安装教程
  12. mod mpm event php7.1,CentOS 7 安裝 PHP-FPM 及使用 mod_mpm_event
  13. Assignment中脚注和尾注的正确打开方式
  14. 用英文字母解析漩涡鸣人
  15. 谷歌网盘下载 根据文件ID miniimagenet
  16. Web Editor插件 网页在线编辑器
  17. C#串口通讯+BigEndian+Little-Endian(大端和小端方案)
  18. android 常用加密,分享一下Android各种类型的加密
  19. B1192 [HNOI2006]超级英雄Hero 二分图匹配
  20. TBschedule入门

热门文章

  1. 用百度搜索SB,为什么是google排第一?
  2. matlab 毕业论文题目,matlab论文题目
  3. MySQL(三):InnoDB和MyISAM
  4. 汇编语言的符号拓展指令CBW、CWD、CDQ、CWDE、CDQE
  5. php时间戳、日期datetime转换
  6. 按照物种丰度对OTU表格进行拆分-丰富和稀有物种识别
  7. cn2an:中文数字转阿拉伯数字
  8. MIME Types MIME 类型
  9. x平方检验计算_卡方检验具体怎么计算
  10. 树莓派研究笔记(7)-- lakka 《仙剑奇侠传》的完美移植