`
oboaix
  • 浏览: 275316 次
社区版块
存档分类
最新评论

5个人30秒过河问题(原创)

    博客分类:
  • JAVA
阅读更多

    现在又贴出一道简单小游戏模拟题,计算最佳过河方式,代码共享,历史记录。

网上极其流行的小游戏,掏出自己的一点想法,抛砖引玉:

    题如下:

    晚上5个人过河,所需时间分别为1,3,6,8,12秒,每次过两个或者一个,

过河必须要拿火把,而火把持续时间为30秒,怎样5个人都能过去?

 

 

执行环境(WinXP+java version "1.5.0_06"

 

/**
*created by zxb
*Email:zxbxiaobo@sina.com
*date  2010-4-17 - 上午01:25:03 
*zxb 开源测试项目 test
*to do TODO
**/


package com.java.algorism;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;


/**
 * 晚上5个人过河,所需时间分别为1,3,6,8,12秒,每次过两个或者一个,
 * 过河必须要拿火把,而火把持续时间为30秒,怎样5个人都能过去?
 * 思路:模拟java.util.List类的五个数字值组成,折返数字值之和小于30,实际返回值应该为29;
 * @author zxb
 *
 */
public class FivePersonCrossRiver {

	public static void main(String[] args) {
		List<Integer> right=new ArrayList<Integer>();
		List<Integer> left=new ArrayList<Integer>();
		left.add(1);left.add(3);
		left.add(6);left.add(8);
		left.add(12);
		System.out.println("-------------过河之前------------------");
		System.out.println("左岸所有人耗费火把时间之和:"+getAllListSum(left));
		System.out.println("右岸所有人耗费火把时间之和:"+getAllListSum(right));
		crossRiver(left,right,true,30);
		System.out.println("-------------过河之后------------------");
		System.out.println("左岸所有人耗费火把时间之和:"+getAllListSum(left));
		System.out.println("右岸所有人耗费火把时间之和:"+getAllListSum(right));
	}

	/**
	 * 
	 * @param left		 左边人数
	 * @param right      右边人数
	 * @param direction  默认为向右边方向前行 往返折回  direction=true-->右边;direction=false-->左边
	 * @param sumTime    耗费时间数(小于指定的值 30)
	 * 打印同一行为两人一起合并过河,时间取其大者为准
	 */
	public static void crossRiver(List<Integer> left,List<Integer> right,boolean direction,int sumTime){
		int count=0;//计数器
		int num=0;
		int sum=0;
		List<Integer> l=null;
		List<Integer> rec=new ArrayList<Integer>();
		while((left !=null && (num=left.size())>0)){
			if(direction){
				l=getRandomNum(left,2);
				right.addAll(l);
				rec.addAll(l);
				rec.add(0);
				left.removeAll(l);
				sum+=getListSum(l);
				if(sum>=sumTime){
					left.addAll(right);
					right.removeAll(right);
					sum=0;
					rec.removeAll(rec);
					continue;
				}
				direction=false;
				count++;
			}else{
				l=getRandomNum(right,2);
				right.removeAll(l);
				left.addAll(l);
				rec.addAll(l);
				rec.add(0);
				sum+=getListSum(l);
				if(sum>=sumTime){
					left.addAll(right);
					right.removeAll(right);
					sum=0;
					direction=true;
					rec.removeAll(rec);
					continue;
				}
				direction=true;
				count++;
			}
		}
		for (int i = 0, len = rec.size(); i < len; i++) {
			if(rec.get(i)==0){
				System.out.println();
				direction=!direction;
			}else{
				System.out.print((direction?"左===>>":"右===>>")+rec.get(i)+",\t");
			}
			
		}
	}
	
	/**
	 * 从List集合中随机抽取count个数以下的list集合(list.size()<=count)
	 * @param list
	 * @param count
	 * @return
	 */
	public static List<Integer> getRandomNum(List<Integer> list,int count){
		List<Integer> l=new ArrayList<Integer>();
		int k=0,m=0;
		k=(list!=null?list.size():0);
		if(list!=null && k>=count){
			Collections.shuffle(list);
			m=(new Random().nextInt(count)+1);
			for (int i = 0; i < m; i++) {
				l.add(list.get(i));
			}
		}else{
			l.addAll(list);
		}
		return l;
	}
	/**
	 * 获取List对象中的所有数字值的和
	 * @param list
	 * @return
	 */
	public static int getAllListSum(List<Integer> list){
		int sum=0;
		for (int i = 0, len = list.size(); i < len; i++) {
			sum+=list.get(i);
		}
		return sum;
	}
	/**
	 * 获取List对象中所有数字值的最大值
	 * @param list
	 * @return
	 */
	public static int getListSum(List<Integer> list){
		if(list==null || list.size()<1){
			return 0;
		}else{
			Collections.sort(list);
			return list.get(list.size()-1);
		}
	}
}

 

分享到:
评论

相关推荐

    商人过河问题的Matlab程序

    商人过河问题的Matlab程序,供学习数学建模或者对趣味性数学感兴趣的人参考。

    商人过河问题的MATLAB实现

    商人过河问题的MATLAB实现,MATLAB源代码。

    Java简单实现农夫过河问题示例

    三、农夫过河问题的解决思路 解决农夫过河问题的思路主要有以下几个步骤: 1. 初始状态:老伯伯和所有动物在一条河岸上。 2. 判断当前河岸的安全性:使用isSafe方法来判断当前河岸的情况是否安全。 3. 农夫过河:...

    人工智能野人传教士过河问题

    野人传教士过河问题源自一种智力谜题,描述了三个传教士和三个野人被困在河的一侧,只有一艘只能载两个人的小船。问题的目标是让所有人都能安全过河,但有一个限制条件:如果野人的数量超过传教士,野人会吃掉传教士...

    数学建模 夫妻过河源码

    ### 数学建模之夫妻过河问题解析及MATLAB实现 #### 一、问题背景与定义 **夫妻过河问题**是一种经典的组合优化问题,在该问题中,一定数量的夫妻需要借助一条小船过河。小船有载重限制,并且每次只能由一个人划船...

    商人过河问题C语言源码

    商人过河问题是数学建模中的一个经典问题,程序利用链表存储渡河状态,使用穷举的算法实现。该算法会找出N个商人/随从渡河的一个可行方案,但并不保证是最佳方案。写完这个程序后让我想到的居然是图的深度优先搜索,...

    猎人过河问题c++源码

    猎人过河问题是一个经典的逻辑谜题,它涉及到狼、羊和白菜三者之间的相互关系。在这个问题中,猎人需要将这三样物品安全地运送到河的对岸,而每次只能携带一样物品。在猎人不在场的情况下,狼会吃掉羊,羊则会吃掉...

    农夫过河的问题

    农夫过河问题是一个典型的逻辑难题,它不仅要求解题者运用逻辑思维,还需要他们将问题抽象化,设计出有效的算法来求解。该问题的设定非常简洁,却蕴含了丰富的约束条件,通过对这些条件的分析,我们能够找到解决问题...

    农夫过河问题代码

    农夫过河问题的一种解法.一个在校大学生的课程设计。请斧正!

    农夫过河问题的算法与实现.doc

    农夫过河问题的算法与实现 农夫过河问题是指农夫带一只狼、一只羊和一棵白菜在河南岸,需要安全运到北岸。这类问题的实质是系统的状态问题,要寻求的是从初始状态经一系列的安全状态到达系统的终止状态的一条路径。...

    商人过河问题数学建模.pdf

    (2)三个随从先过河(5,2),回来一个随从(5,3),过去两个随从(5,1)回来一个随从(5,2),再过去三个商人(2,2),回来一个商人一个随从(3,3),再过去三个商人(0,3),回来一个随从(0,4),过去三个随从(0...

    农夫过河问题(C语言)设计

    经典的农夫过河问题。 用1代表狼,2代表羊,3代表白菜。则在河的某一岸边,物体的分布有8种情况: 当两物体在一起并且它们的代码之和为3或5时,将导致相克的情况出现。 设计c语言算法实现过河,并将结果打印

    野人与传教士过河问题的实现

    野人与传教士过河问题的实现 安装JDK、配置环境变量,打开Eclipse导入ch05项目,运行主类crossriver.CrossRiver即可启动演示程 序。

    数据结构农夫过河问题

    【数据结构农夫过河问题】是一个经典的逻辑与算法题目,涉及到广度优先搜索(BFS)的应用。问题的核心在于如何安全地通过一系列操作将狼、羊和白菜都运送到河的对岸,同时保证在农夫不在场时,任何可能导致危险的...

    传教士与野人过河问题

    传教士与野人过河问题实验报告 本实验报告的目的是了解知识表示相关技术,掌握问题规约法或者状态空间法的分析方法。实验内容包括梵塔问题实验和状态空间法实验,旨在熟悉和掌握问题规约法的原理、实质和规约过程;...

    商人过河问题参考代码

    商人过河问题参考代码 商人过河问题参考代码

    原创商人过河问题代码-du.txt

    原创商人过河问题代码-du.txt 商人过河问题代码 在命令窗口中输入如下命令即可执行: p=[3 3]; [p,q]=du 说明,此程序可求解2个随从和2个商人,3个随从和3个商人的情况,当n大于3时,不能求解,因为此程序的前提...

    基于C++的农夫过河问题算法设计与实现方法

    "基于C++的农夫过河问题算法设计与实现方法" 本文主要介绍了基于C++的农夫过河问题算法设计与实现方法,简单描述了农夫过河问题,并结合实例形式详细分析了基于C++实现农夫过河问题的相关算法实现步骤与操作技巧。 ...

    java农夫过河问题

    《Java实现农夫过河问题详解》 农夫过河问题是一个经典的逻辑推理问题,源自中国古代的智力谜题,也被称为“狼、羊、菜”问题。在这个问题中,农夫需要将自己、一只狼、一只羊和一棵蔬菜从河流的一边安全地运送到另...

    农夫过河问题【代码+流程图+可执行文件】

    《农夫过河问题:深度优先遍历图的解决方案》 农夫过河问题是一个经典的逻辑谜题,它涉及到在有限的资源和条件约束下如何有效地解决问题。在这个问题中,农夫需要将自己、一只狼、一只羊和一捆白菜全部安全地从河的...

Global site tag (gtag.js) - Google Analytics