`

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
分享到:
评论

相关推荐

    小孩分油问题(广度优先搜索算法)实验报告及c++程序

    《小孩分油问题的广度优先搜索算法及C++实现》 小孩分油问题是一个经典的逻辑谜题,它涉及到如何利用有限的资源精确地分配物品。在这个问题中,两个小孩只有一斤、七两和三两的三个瓶子,以及一斤的油。目标是将一...

    分油问题 搜索算法 分油问题 搜索算法

    总结来说,分油问题是一个典型的组合优化问题,搜索算法如DFS、BFS和A*是解决问题的有效工具。根据问题的具体特性,选择合适的算法并结合优化策略,可以更高效地找到解决方案。理解这些算法的工作原理并熟练运用,对...

    PUZZLE15_dfs_C++求解15拼图问题_bfs_

    在这个问题中,我们将探讨如何使用深度优先搜索(DFS)、广度优先搜索(BFS)以及迭代加深的深度优先搜索(IDDFS)来解决15拼图问题。 **深度优先搜索(DFS):** DFS是一种用于遍历或搜索树或图的算法。在这个问题...

    分油问题 c语言程序设计 贫油问题 系统报告

    分油问题的算法通常采用广度优先搜索(BFS)策略,因为它保证能找到最短的路径。以下是算法的基本步骤: 1. **初始化**:输入三个油桶的容量(X=10斤,Y=7斤,Z=3斤)和目标油量(T=5斤)。创建一个队列,将初始...

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

    在IT领域,尤其是在算法和计算机科学中,"魔方-BFS-输入_魔方bfs_魔方降群法+双向bfs_魔方降群_"这个标题涉及到的是使用广度优先搜索(Breadth First Search, BFS)解决魔方问题的高级技巧。魔方是一种三维旋转拼图...

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

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

    八数码BFS,DFS,BBFS,Astar实现

    在八数码问题中,BFS通常能找出最短的步数解,因为它总是先探索更接近目标的状态。BFS使用队列数据结构来存储待访问的节点,确保先访问最近的节点。 其次,**深度优先搜索(DFS)**是一种深入探索树或图的分支,...

    八数码问题(数字华容道,九宫格)深度搜索(DFS)广度搜索(BFS)和A*算法C++源码

    在计算机科学领域,解决这类问题通常运用图搜索算法,如深度优先搜索(DFS)、广度优先搜索(BFS)以及启发式搜索算法A*。 深度优先搜索(DFS)是一种用于遍历或搜索树或图的算法。在八数码问题中,DFS会尽可能深地...

    广度优先检索 BFS.zip

    在实际应用中,BFS常用于解决多种问题,如查找最短路径(非负权图)、判断两个节点是否联通、求解最小生成树的Kruskal算法等。通过理解和实现BFS,可以提升对图论和算法的理解,同时对解决复杂问题的能力有所助益。 ...

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

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

    bfs.rar_Bfs算法_bfs

    总的来说,BFS算法在解决八数码难题这样的问题时,能有效地找到解决方案或判断无解,而`bfs.cpp`的代码实现是理解这一过程的关键。通过学习和理解这段代码,我们可以更深入地掌握BFS的工作原理,并将其应用于其他...

    BFS.rar_bfs_bfs matlab_bfs matlab

    在MATLAB环境中,BFS可以被应用于解决各种问题,比如网络路径查找、最短路径计算等。这里的"rar"可能表示这是一个压缩文件,包含了用MATLAB实现的BFS算法。 描述中提到,这个压缩包包含的是一个基于共轭方向法的BFS...

    acm程序设计竞赛广度搜索BFS实例

    4. **解迷宫问题**:在寻找迷宫出口的问题中,BFS可以避免陷入局部最优,因为它总是先尝试距离起点最近的可能路径。 5. **拓扑排序**:对于有向无环图(DAG),BFS可以进行拓扑排序,将所有节点按照没有前驱的顺序...

    bfs.rar_bFS maze

    【标题】:“bfs.rar_bFS maze”是一个与广度优先搜索(BFS)算法相关的项目,用于解决迷宫类游戏中的路径寻找问题。 【描述】:在这个项目中,我们利用广度优先搜索策略来解决从迷宫的一个点找到另一个点的最短...

    分油问题C语言.pdf

    为了解决这个分油问题,我们可以采用**广度优先搜索(BFS)**策略,这可以通过一个**队列**来实现。在程序中,我们首先定义了一个结构体`struct ele`,它包含了三个油桶的当前油量、倒油的源桶和目标桶以及状态在...

    eightPuzzle_BFS_八数码python_八数码问题_源码.zip

    【标题】"eightPuzzle_BFS_八数码python_八数码问题_源码.zip" 提供的是一个关于八数码问题(又称滑动拼图游戏)的解决方案,采用Python编程语言,并利用宽度优先搜索(Breadth First Search, BFS)算法。八数码问题...

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

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

    算法之BFS与DFS

    - **BFS的应用**:BFS在寻找最短路径问题中尤为有用,例如在无权图中寻找两节点间的最短路径,或者在网络中寻找最近的服务器。另外,拓扑排序也是BFS的一个典型应用,它可以按照节点的入度顺序对有向无环图(DAG)...

    simulink BFSK仿真

    2. **二进制编码器**:将二进制序列转换为适合调制的格式,如曼彻斯特编码或差分曼彻斯特编码,以减少信号边缘的上升时间,提高抗干扰能力。 3. **BFSK调制器**:根据二进制序列,将载波频率切换到f1或f2,生成调制...

Global site tag (gtag.js) - Google Analytics