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

三个僧侣过河问题模拟实现(原创)

    博客分类:
  • JAVA
阅读更多

今天突然想起以前同事提到过的一个过河问题,游戏设计思路

需要使用程序代码体现其过程,心血来潮,来一把.....如下:

 三个僧侣和三个食人族过河
 目的:需要把他们六个一起使用一条船送到河的对面岸上
 条件:当食人族的数目超出僧侣的数目时,就会出现食人族吃人的想象(是不允许的)
          每条船最多能坐下两个(僧侣或者食人族),每次船启动时必须有一个在船上。
 思路:必须先将所有的食人族过河,再利用食人族将所有的僧侣送过河,最后将食人族再送过河。  
          模拟僧侣的攻击力为4(总攻击力为12),食人族攻击力为3(总攻击力为9),
          当每边食人族的攻击力和超出僧侣的攻击力和的时候就发生事故,   
          必须控制僧侣攻击力和超出食人族攻击力和的值。
 结果:最短应该是小于等于11次往返次数    

 

 

 

 

 

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

/**
*created by zxb
*date  2010-4-5 - 上午10:05:38 
*zxb 开源测试项目 test
*to do TODO
**/


package com.java.algorism;

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

/**
 * 三个僧侣和三个食人族过河
 * 目的:需要把他们六个一起使用一条船送到河的对面岸上
 * 条件:当食人族的数目超出僧侣的数目时,就会出现食人族吃人的想象(是不允许的)
 *      每条船最多能坐下两个(僧侣或者食人族),每次船启动时必须有一个在船上。
 * 思路:必须先将所有的食人族过河,再利用食人族将所有的僧侣送过河,最后将食人族再送过河。  
 *      模拟僧侣的攻击力为4(总攻击力为12),食人族攻击力为3(总攻击力为9),
 *      当每边食人族的攻击力和超出僧侣的攻击力和的时候就发生事故,   
 *      必须控制僧侣攻击力和超出食人族攻击力和的值。
 * 结果:最短应该是小于等于11次往返次数     
 */
public class CrossRiver {

	private static final List<Integer> list=new ArrayList<Integer>();
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Senglv sl1=new Senglv();
		Senglv sl2=new Senglv();
		Senglv sl3=new Senglv();
		Shirenzu sr1=new Shirenzu();
		Shirenzu sr2=new Shirenzu();
		Shirenzu sr3=new Shirenzu();
		List<Object> l1=new ArrayList<Object>();
		List<Object> l2=new ArrayList<Object>();
		l1.add(sl1);l1.add(sl2);l1.add(sl3);
		l2.add(sr1);l2.add(sr2);l2.add(sr3);
		List<Object> right=new ArrayList<Object>();//右边数据
		List<Object> left=new ArrayList<Object>();//左边数据
		right.addAll(l1);right.addAll(l2);
		for (int i = 1; i < 1000; i++) {
			boolean flag=((i+1)%2)==0?true:false;
			transportData(flag?left:right,flag?right:left,flag);
		}
		Collections.sort(list);
		System.out.println("最小折返次数:"+list.get(0));
	}

	/**
	 * 
	 * @param left
	 * @param right
	 * @param ship=true 为右边;ship=false 为左边 
	 */
	public static void transportData(List<Object> left,List<Object> right,boolean ship){
		int count=0;//计数器
		int k=0;
		List<Object> l=null;
		while((right !=null && (k=right.size())>0)){
			if(ship){
				l=getRandomNum(right,2);
				left.addAll(l);
				right.removeAll(l);
				if(!compareATK(right) || !compareATK(left)){
					right.addAll(l);
					left.removeAll(l);
					continue;
				}
				ship=false;
				count++;
			}else{
				l=getRandomNum(left,2);
				left.removeAll(l);
				right.addAll(l);
				if(!compareATK(right) || !compareATK(left)){
					right.removeAll(l);
					left.addAll(l);
					continue;
				}
				ship=true;
				count++;
			}
		}
		//System.out.println("往返次数==="+count);
		list.add(count);
	}
	
	/**
	 * 攻击力比较大小 僧侣的攻击力和大于食人族的攻击力和时返回true,
	 * 当一边为空时也返回true,否则计算实际攻击力大小
	 * @param l
	 * @return
	 */
	public static boolean compareATK(List<Object> l){
		int s1=0,s2=0;
		for (int i = 0, len = l.size(); i < len; i++) {
			if(l.get(i) instanceof Senglv){
				s1+=((Senglv)l.get(i)).getATK();
			}else if(l.get(i) instanceof Shirenzu){
				s2+=((Shirenzu)l.get(i)).getATK();
			}
		}
		return s1==0 || s2==0 || s1>s2;
	}
	/**
	 * 从List集合中随机抽取count个数以下的list集合(list.size()<=count)
	 * @param list
	 * @param count
	 * @return
	 */
	public static List<Object> getRandomNum(List<Object> list,int count){
		List<Object> l=new ArrayList<Object>();
		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;
	}
	
	/**
	 * 
	 * @param m1
	 * @param m2
	 * @return
	 */
	public static boolean compareATK(Map<String,Integer> m1,Map<String,Integer> m2){
		int s1=0,s2=0;
		while(m1.values().iterator().hasNext()){
			s1+=m1.values().iterator().next();
		}
		while(m2.values().iterator().hasNext()){
			s2+=m2.values().iterator().next();
		}
		return s1>s2;
	}
}

class Senglv{
	
	public Senglv(){
	}
	
	private int ATK=4;
	
	public int getATK() {
		return ATK;
	}
	
	public void setATK(int atk) {
		ATK = atk;
	}
}

class Shirenzu{
	
	public Shirenzu(){
	}
	
	private int ATK=3;
	
	public int getATK() {
		return ATK;
	}
	
	public void setATK(int atk) {
		ATK = atk;
	}
}

 

分享到:
评论

相关推荐

    源代码及输出模拟汉诺塔

    这个问题的数学模型可以简化为三个柱子(A、B、C),以及N个不同大小的圆盘,初始时所有圆盘都在柱子A上,按照从大到小的顺序排列,目标是将所有圆盘按照同样的顺序移动到柱子C上,每次只能移动最上方的一个圆盘,且...

    递归实现:汉诺塔问题

    神殿的僧侣们要在世界末日之前完成这样一个任务:将这些金盘从第一根柱子全部移到第三根柱子上去,移动时必须遵循以下规则: 1. 每次只能移动最上面的一个盘子; 2. 在任何时候都不能将大盘子放在小盘子之上。 ###...

    hanoi 递归实现 清楚明了

    具体到汉诺塔问题中,可以将整个问题视为以下三个步骤: 1. **第一步**:将柱子A上的N-1个盘子借助柱子C移动到柱子B上。 2. **第二步**:将柱子A上剩下的最后一个大盘子直接移动到柱子C上。 3. **第三步**:将柱子B...

    2021届高考英语模拟预热卷(新高考)(三).pdf

    其三个独立的半岛大致可以概括为卡桑德拉(Kassandra)拥有夜生活,希托尼亚(Sithonia)拥有沙滩,而阿索斯(Athos)以僧侣闻名。卡桑德拉离塞萨洛尼基最近,建设更为完善;希托尼亚更为安静,拥有露营地、隐蔽海湾...

    汉诺塔问题 C++

    汉诺塔问题的起源可追溯到一个印度的古老传说,讲述了僧侣们如何将一系列金盘从一个塔移动到另一个塔上,期间使用了三个柱子。这个谜题的挑战在于如何在有限的条件下,以最少的移动次数完成任务。问题的规则很简单:...

    python上的汉诺塔实现

    其基本思路是将原问题分解为两个子问题:首先将n-1个盘子借助第三个柱子从A移动到B,然后将剩余的一个大盘子从A移动到C,最后再将之前移动到B的n-1个盘子借助A柱子移动到C。通过这种方式,我们可以将问题不断分解...

    双色Hanoi塔问题参考代码

    传说中,寺庙中的僧侣们需要将64个金盘从一个塔座移动到另一个塔座上,中间可以借助第三个塔座,但必须遵守特定的规则。传统的汉诺塔问题规则包括: 1. 每次只能移动最上方的一个圆盘。 2. 任何时候都不能将一个较大...

    最简单的python代码实现汉诺塔

    4. **测试**:定义变量 `num_disks` 为 3,表示从最简单的情况开始尝试,即移动三个盘子。然后调用 `hanoi` 函数开始游戏。 #### 递归思想 汉诺塔问题的核心在于利用递归的思想解决问题。具体来说,解决汉诺塔问题...

    TheCodeMonksOrg:僧侣组织官方网站

    僧侣我们热情的代码僧侣很好奇,希望通过软件开发来解决各种困难。 我们为FOSS启动了Code Monks。 我们想回馈给我们从他们那里学到很多知识的社区。僧侣 Spikey sanju 萨默·纳瓦兹(Samer Nawaz) 瓦塞姆·阿克拉姆...

    汉诺塔问题java.docx

    汉诺塔问题涉及三个柱子,我们称之为A、B和C。盘子大小不一,全部初时堆叠在柱子A上,且大盘子在下,小盘子在上。任务是将这些盘子全部移到柱子C上,移动时遵循三个规则:一次只能移动一个盘子;任何时刻,较大的...

    java实现hanoi编程

    当有多个盘子时,则先将上面的i-1个盘子借助第三个柱子移动到辅助柱子,再将最下面的大盘子直接移动到目标柱子,最后再将之前移动的i-1个盘子从辅助柱子移动到目标柱子。 - **移动方法(move)**:这是一个简单的...

    2020云南教师资格考试综合知识与能力:古埃及的僧侣和文士学校你知道多少.pdf

    这两类学校在古埃及的文化、科学、行政管理等多个领域中扮演了至关重要的角色,不仅为古埃及社会的发展提供了知识基础,而且为后世教育体系的发展提供了宝贵的经验。 僧侣学校,又称为寺庙学校,主要建立在大城市中...

    经典趣味算法

    相传有三个柱子和64个大小不一的金盘子,僧侣们夜以继日地按着规则移动这些盘子,目标是将所有的盘子从一个柱子移动到另一个柱子上。这个过程中有三个原则:一次只能移动一个盘子;大盘子必须始终在小盘子的下方;...

    汉诺塔.doc

    这个函数接受三个参数,分别代表三根柱子,以及一个表示盘子数量的整数`n`。当只有一个盘子时,可以直接将其从源柱子移动到目标柱子。对于多于一个盘子的情况,需要先将上面的`n-1`个盘子借助一个辅助柱子移动到目标...

    jadecraft:Shadowcraft,僧侣专用

    它的基础是它是一个NodeJS应用程序,它将允许对僧侣(风行者)伤害进行建模。 为什么这是相关的? 好吧,基本上,它使我们可以将电子表格放在一边。 另外,对于我来说,查看数据建模是一个很不错的项目,并且对...

    汉诺塔问题

    3. **借助第三个柱子完成移动**:如果目标柱子已经有盘子,则必须借助第三个柱子才能完成移动。 #### 三、汉诺塔问题求解思路 对于汉诺塔问题的求解,主要采用递归的方法来实现。 1. **递归定义**:将n个盘子从A...

    僧侣钻石

    在这个名为"TheMonkDiamond-main"的压缩包文件中,我们可以推测它包含了与解决这个“僧侣钻石”问题相关的源代码、资源文件或者其他辅助材料。 在HTML中,"僧侣钻石"可能是一个布局或视觉效果的实现,比如一个复杂...

    递归方法求解汉诺塔问题

    具体来说,我们可以将整个问题分解为以下三个步骤: 1. 将 n-1 个盘子从起始柱子 A 移动到辅助柱子 B 上。 2. 将剩下的那个盘子从起始柱子 A 移动到目标柱子 C 上。 3. 将 n-1 个盘子从辅助柱子 B 移动到目标柱子 C...

    HANNUOTA.docx

    汉诺塔问题可以用三个柱子来模拟,通常被称为初始柱、目标柱和辅助柱。初始柱是圆盘开始摆放的位置,目标柱是圆盘需要最终到达的地方,而辅助柱则在移动过程中起到过渡的作用。解决汉诺塔问题的关键在于找到一种策略...

    [教师公开招聘考试密押题库与答案解析]教师公开招聘考试小学数学模拟30.docx

    7. 小学数学学习过程通常分为**习得阶段**、**保持阶段**和**提取阶段**,这三个阶段是学生掌握数学知识的关键步骤。 8. **理解**是小学数学学习的重要阶段,通过分析、综合、抽象和概括,学生能掌握概念的基本特征...

Global site tag (gtag.js) - Google Analytics