java wate_Water.java
//广度优先搜索
// 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相关推荐
- java unlimited_具有无限参数的Java方法(Java method with unlimited arguments)
具有无限参数的Java方法(Java method with unlimited arguments) Spring框架使用方法,您可以根据需要传递尽可能多的参数. 我想写一个函数,也可以采取无限量的 ...
- 介绍java -cp java -jar的区别
java -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,window上分号";" java -cp &am ...
- 【Java】Java连接Mysql数据库的demo示例
[Java]Java连接Mysql数据库的demo示例 1.安装mysql数据库 2.下载java-mysql-connector.jar包 3.完成java配置 4.写java代码运行测试 1.安装 ...
- java抓取网页标题内容_[Java教程]java 网页页面抓取标题和正文
[Java教程]java 网页页面抓取标题和正文 0 2014-07-10 09:01:30 import java.io.BufferedReader;import java.io.IOExcept ...
- Java基础-Java中的堆内存和离堆内存机制
Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 转载于:https://www.cnblogs.com/yinzhengjie/p/9 ...
- Java 异常java.lang.IllegalArgumentException: Illegal group reference
Java 异常java.lang.IllegalArgumentException: Illegal group reference 参考文章: (1)Java 异常java.lang.Illegal ...
- Java基础-JAVA中常见的数据结构介绍
Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...
- 4.6 W 字总结!Java 11—Java 17特性详解
作者 | 民工哥技术之路 来源 | https://mp.weixin.qq.com/s/SVleHYFQeePNT7q67UoL4Q Java 11 特性详解 基于嵌套的访问控制 与 Java 语言 ...
- 做了6年的Java,java视频教程传智播客
JAVA基础 JAVA异常分类及处理 异常分类 异常的处理方式 Throw和throws的区别 JAVA反射 动态语言 反射机制概念 (运行状态中知道类所有的属性和方法) Java反射API 反射使用 ...
最新文章
- 深度学习前人精度很高了,该怎么创新?
- HTTP将死?又拍云布局HTTPS 护航网页安全加速
- ARM+linux+2440嵌入式开发相关经典书籍(转)
- spacevim 添加自动折行
- 2336: [HNOI2011]任务调度 - BZOJ
- P3302 SDOI2013森林
- LoadDruidSegmentStep failed File does not exist: /druid/segments
- 域外计算机访问域内共享,域外用户如何拥有让其他电脑加域或退域的权限
- GCC options总结
- win10 安装oracle11g R2的64位版本
- TeeChart安装教程
- mod mpm event php7.1,CentOS 7 安裝 PHP-FPM 及使用 mod_mpm_event
- Assignment中脚注和尾注的正确打开方式
- 用英文字母解析漩涡鸣人
- 谷歌网盘下载 根据文件ID miniimagenet
- Web Editor插件 网页在线编辑器
- C#串口通讯+BigEndian+Little-Endian(大端和小端方案)
- android 常用加密,分享一下Android各种类型的加密
- B1192 [HNOI2006]超级英雄Hero 二分图匹配
- TBschedule入门