1 猫,狗,鱼过河问题
有一条河,河上没有桥,一个农夫带着一只狗,一只猫,一条鱼过河
农夫发现岸边有一天船
这个船一次只能装载农夫和任意一种东西过河
当农夫从左岸划船到右岸时,如果农夫离开了其中的一边,另一边可能会发生问题:
猫和狗在一起,狗咬猫
猫和鱼在一起,猫咬鱼
编程解上述问题
分析:
通过分析,河的存在性不重要,需要设计左岸和右岸,整个问题的最终目标:把三个动物从左边带到右边
左岸和右岸描述动物现在待得地方
设计容器 A,表示左边,设计容器 B,表示右边
数组:缺点,获取数组中已有的元素数量非常不方便
集合:优点,获取数组中已有的元素数量非常方便
所以,使用集合
船是绑定着河和这个题目出现的一个模型,所以不需要
人:起的作用仅仅是为了人所在的岸边不会出现问题,所以人要么在左边,要么在右边,所以使用 boolean 型
设计一个 boolean 值描述人在哪一边,当人在左边,只需要检测右边的矛盾关系
猫狗鱼:
特点:任意一个动物都可能和另一种动物发生矛盾
猫狗鱼之间存在着一种制约关系,可以通过一个类的几个属性描述这种关系
程序执行过程中的问题
1. 带过去动物后,发现出现问题,需要回退
- //设计一种模型,保存移动前的状态,当移动后出现问题,回归之前的状态
2. 移动过程中,考虑当前移动的操作是否曾经出现过,如果出现过
- //设计一种模型,用于描述曾经出现过的所有的移动状态//设计一种模型,保存之前所有移动的状态,每次移动都要保存import java.util.ArrayList;class CrossRiver{//河左岸private ArrayList left = new ArrayList();//河右岸private ArrayList right = new ArrayList();//人在左边是true,在右边是falseprivate boolean flag = true;//定义一个方法,用于执行当前的过河操作void crossRiver(){//1.初始化三个动物initAnimal();//2.开始执行过河操作//设计一个循环while(right.size() != 3){//1.首先检测人在那边//1.1人在左,左边发生移动操作,//1.2人在右,右边发生移动操作if(flag){//移动left->rightmove();}else{//移动right->leftmove();}}}//移动操作void move(){//从一个集合中删除一个数据,将这个数据添加到另一个集合中//这里还需要考虑人单独移动的情况//这里就实现了一个移动操作Object obj = left.remove(1);//删除right.add((Animal) obj);//人的位置要变化flag = !flag;//移动后一定要检测是否出现问题//检测哪边?//flag = true ;// 左//flag = false; //右//开始检测:人不再一边,动物数量超过1个就检测// 人在右边,左边集合中只有一个元素,右边集合中有两个元素//不检测// 人在右边,左边集合中有两个元素或者三个元素,检测}//初始化动物//1是狗,2是猫,3是鱼void initAnimal(){//创建三个动物,并且添加到左岸Animal cat = new Animal();cat.afraid = 1;cat.control = 2;left.add(cat);//按照上面的格式,将三个动物都添加到河左岸Animal dog = new Animal();dog.afraid = -1;dog.control = 1;left.add(dog);Animal fish = new Animal();fish.afraid = 2;fish.control = 3;left.add(fish);}public static void main(String[] args){}}class Animal{//有一被制约int afraid;//有一制约int control;//设计一个制约关系boolean check(Animal a){/*if(this.afraid == a.control || a.afraid == this.control){//出现了不和谐的现象return true;}else{return false;}*/return this.afraid == a.control || a.afraid == this.control;}}
就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: http://www.92to.com/bangong/2017/02-27/17743582.html