`

BFS解小孩分油问题

    博客分类:
  • J2SE
 
阅读更多

广度优先搜索(Breadth-first Search)算法描述:

 

  1. 用N表示初始结点列表(N待扩展)
  2. 如果N为空集,则退出并给出失败信号
  3. n取为N的第一个结点,并在N中删除结点n,放入已访问结点列表
  4. 如果n为目标结点,则退出并给出成功信号
  5. 否则,将n的子结点加到N的末尾,并返回2步
分油问题描述:
两个小孩去打油,一人带了一个一斤的空瓶,另一个带了一个七两、一个三两的空瓶。原计划各打一斤油,可是由于所带的钱不够,只好两人合打了一斤油,在回家的路上,二人想平分这一斤油,可是又没有其它工具。试仅用三个瓶子(一斤、七两、三两)精确地分出两个半斤油来。

分油问题的Java实现:
1、对问题建模:问题中的实体对象是空瓶,建立Bottle对象,包含空瓶容量以及当前油量属性
int volume = 0;
int oil = 0;
2、确定分油的可行方式,并确定分油规则
switch (n) {
case 1: // 瓶子1向瓶子2倒油
	if (!bottle1.isEmpty() && !bottle2.isFull()) {
		n = bottle2.needForFull() <= bottle1.oil ? bottle2
				.needForFull() : bottle1.oil;
		newState = new StateNode(bottle1.oil - n, bottle2.oil + n,
				bottle3.oil, this);
	}
	break;
case 2: // 瓶子1向瓶子3倒油
	if (!bottle1.isEmpty() && !bottle3.isFull()) {
		n = bottle3.needForFull() <= bottle1.oil ? bottle3
				.needForFull() : bottle1.oil;
		newState = new StateNode(bottle1.oil - n, bottle2.oil,
				bottle3.oil + n, this);
	}
	break;
case 3: // 瓶子2向瓶子1倒油
	if (!bottle2.isEmpty() && !bottle1.isFull()) {
		n = bottle1.needForFull() <= bottle2.oil ? bottle1
				.needForFull() : bottle2.oil;
		newState = new StateNode(bottle1.oil + n, bottle2.oil - n,
				bottle3.oil, this);
	}
	break;
case 4: // 瓶子2向瓶子3倒油
	if (!bottle2.isEmpty() && !bottle3.isFull()) {
		n = bottle3.needForFull() <= bottle2.oil ? bottle3
				.needForFull() : bottle2.oil;
		newState = new StateNode(bottle1.oil, bottle2.oil - n,
				bottle3.oil + n, this);
	}
	break;
case 5: // 瓶子3向瓶子1倒油
	if (!bottle3.isEmpty() && !bottle1.isFull()) {
		n = bottle1.needForFull() <= bottle3.oil ? bottle1
				.needForFull() : bottle3.oil;
		newState = new StateNode(bottle1.oil + n, bottle2.oil,
				bottle3.oil - n, this);
	}
	break;
case 6: // 瓶子3向瓶子1倒油
	if (!bottle3.isEmpty() && !bottle2.isFull()) {
		n = bottle2.needForFull() <= bottle3.oil ? bottle2
				.needForFull() : bottle3.oil;
		newState = new StateNode(bottle1.oil, bottle2.oil + n,
				bottle3.oil - n, this);
	}
	break;
}
 3、在上述的规则,即广度优先搜索的搜索空间中,寻找目标状态。为提高搜索效率,可记住已经搜索过的节点,避免重复搜索,进入无限循环。
ArrayList<StateNode> stateList = new ArrayList<StateNode>(); // 存放所有出现过的状态的数组
if (!tag) { // 如没出现过 加入状态队列和数组
	stateQueue.addFirst(newState);
	stateList.add(newState);
}
  


测试结果:
[10 0 0]
[3 7 0]
[3 4 3]
[6 4 0]
[6 1 3]
[9 1 0]
[9 0 1]
[2 7 1]
[2 5 3]
[5 5 0]


完整代码见附件 
1
3
分享到:
评论

相关推荐

    bfs算法实现八数码问题动画过程化 BFS.html

    以动画的方式采用bfs算法实现八数码问题的解决,html文件可直接运行

    BFS解决八数码问题

    在图1,3*3的方格棋盘上,摆放着1到8这八个数码,有1个方格是空。 如图1所示,要求对空格执行空格左移、空格右移、空格上移和空格下移这四个操作使得棋盘从初始状态(图1左)到目标状态(图1右)。...

    PUZZLE15_dfs_C++求解15拼图问题_bfs_

    使用深度优先和广度优先搜索算法以及迭代加深的深度优先算法求解15拼图问题

    双向BFS算法实现公交车行程问题

    通过双向的BFS算法,使得公交安排这样一个问题在最大程度上减少了时间复杂度。而且对于换乘次数的限制一直是一个瓶颈,会严重增加时间复杂度,但本程序通过matlab巧妙的设计,使得换乘10次以内都可以理想时间内解答...

    代码 基于BFS广度优先搜索算法代码

    代码 基于BFS广度优先搜索算法代码代码 基于BFS广度优先搜索算法代码代码 基于BFS广度优先搜索算法代码代码 基于BFS广度优先搜索算法代码代码 基于BFS广度优先搜索算法代码代码 基于BFS广度优先搜索算法代码代码 ...

    魔方-BFS-输入_魔方bfs_魔方降群法+双向bfs_魔方降群_

    降群法解魔方 哈哈师大 使用双向BFS搜素

    2分图匹配之BFS实现

    2分图匹配的BFS实现,C/C++源码。适用于稀疏二分图,边较少,增广路较短。

    搜索之BFS算法

    详细地介绍BFS的思路模式以及用几个案例教授怎么运用BFS去解题。

    simulink BFSK仿真

    simulink BFSK仿真

    BFS 找最短路.cpp

    题解:Bfs找最短路径(正解,绝对正确)这是c++中一道题的题解

    动态内存+BFS

    动态内存+BFS #include #include #include #include using namespace std; void BFS(list&lt;int&gt; *the_a,int the_N,int the_S,int *the_b){ int *m=new int[the_N]; for(int k1=0;k1;k1++) m[k1]=0; m[the_S-1]=1; ...

    广度优先检索 BFS.zip

    压缩文件里的“bfs-node.h”是头文件,需要在Visual Studio中附加在头文件。这里采取了有向图的邻接链表表现形式,起作用的bfs函数的代码格式参考了《算法导论》这本书上的伪代码。

    bfstree代码

    bfstree代码

    百度文件系统 BFS-Baidu.zip

    现有的分布式文件系统(如HDFS等)无法满足低延迟、高可用、跨地域扩展等方面的需求,所以我们从百度搜索的业务特点出发,开发了自己的分布式文件系统BFS。 设计目标 高可靠、高可用通过将数据副本进行多机房、多...

    C++ BFS迷宫.cpp

    C++ BFS迷宫.cpp

    八码难题BFS的实现

    经典的八码难题BFS广度优先算法的源代码。

    算法之BFS与DFS

    算法之BFS与DFS

    哈工大BFS算法代码

    BFS算法的课程作业,宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想

Global site tag (gtag.js) - Google Analytics