本帖最后由 迷失的独白 于 2014-8-18 22:28 编辑
做完后感觉自己的基础还是不扎实,还是先复习一下吧。“老农与猫、狗、鱼” 代码如下
- package com.itheima;
- import java.util.ArrayList;
- /**
- * 第10题: 一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,
- * 则不会发生这种问题。编程解决猫狗鱼过河问题。
- *
- * @author 王硕
- */
- /**
- *
- * 思路:
- * 先让一只动物过河(不确定),如果河岸上的动物是天敌则初始化,否则继续过河
- * 如果初始化,则再让第二只动物过河,如果河岸上的动物是天敌则初始化,否则继续过河
- *
- */
- public class Test10 {
- public static void main(String[] args) {
- // TODO 自动生成的方法存根
- ArrayList<Animal> riverBank = new ArrayList<Animal>();
- ArrayList<Animal> oppositeBank = new ArrayList<Animal>();
- //new RiverCrossing(new AddPet().pet(riverBank), oppositeBank).function();
- //new RiverCrossing(new AddPet().pet_2(riverBank), oppositeBank).function();
- //new RiverCrossing(new AddPet().pet_3(riverBank), oppositeBank).function();
- new RiverCrossing(new AddPet().pet_4(riverBank), oppositeBank).function();
-
- //打印河对岸的动物
- for(Animal pet : oppositeBank){
- System.out.println(pet.getName());
- }
- }
- }
- class AddPet{
- //ArrayList<Animal> riverBank = new ArrayList<Animal>();
-
- public ArrayList<Animal> pet(ArrayList<Animal> riverBank) {
- riverBank.add(new Animal("狗", "猫"));
- riverBank.add(new Animal("猫", "狗"));
- riverBank.add(new Animal("鱼", "猫"));
- return riverBank;
- }
- public ArrayList<Animal> pet_2(ArrayList<Animal> riverBank) {
- riverBank.add(new Animal("猫", "狗"));
- riverBank.add(new Animal("狗", "猫"));
- riverBank.add(new Animal("鱼", "猫"));
- return riverBank;
- }
- public ArrayList<Animal> pet_3(ArrayList<Animal> riverBank) {
- riverBank.add(new Animal("鱼", "猫"));
- riverBank.add(new Animal("猫", "狗"));
- riverBank.add(new Animal("狗", "猫"));
- return riverBank;
- }
- public ArrayList<Animal> pet_4(ArrayList<Animal> riverBank) {
- riverBank.add(new Animal("狗", "猫"));
- riverBank.add(new Animal("鱼", "猫"));
- riverBank.add(new Animal("猫", "狗"));
- return riverBank;
- }
-
- }
- class RiverCrossing{
- //定义河岸,指向null,临时的为了不空指针异常直接初始化为集合
- private ArrayList<Animal> riverBank = null;
- private ArrayList<Animal> oppositeBank = null;
- private ArrayList<Animal> temp = new ArrayList<Animal>();
-
- public RiverCrossing(ArrayList<Animal> riverBank,
- ArrayList<Animal> oppositeBank) {
- //初始化
- this.riverBank = riverBank;
- this.oppositeBank = oppositeBank;
- this.temp.addAll(this.riverBank);
- }
-
- public void function(){
- //调用过河方法
- riverCrossing();
- }
-
- private void initialization() {
- // 这里是初始化,让动物全部放在河岸
- riverBank.clear();
- oppositeBank.clear();
- this.riverBank.addAll(temp);
- }
- private void riverCrossing() {
- // 第一只过河
- oppositeBank.add(riverBank.get(0));
- riverBank.remove(0);
- //确定初始化的次数
- int count = 0;
- while (true)
- {
- if (riverBank.size() == 2)//判断河岸是否是两只动物
- { count++;
- System.out.println("河岸有2只");//判断是否是天敌
- if (riverBank.get(0).getEnemy().equals(riverBank.get(1).getName())
- || riverBank.get(1).getEnemy().equals(riverBank.get(0).getName()))
- {
- System.out.println("河岸是天敌");//如果是天敌,判断标记是否不同
- if ((riverBank.get(0).isFlag() == riverBank.get(1).isFlag()))
- {
- System.out.println("确定标记相同");//标记相同,不考虑这里,这里只是判断其中的一个
- if (riverBank.get(0).isFlag() == true)
- {
- // 这里其中一个标记,因为顺序的原因,这里不起作用
- System.out.println("不是天敌");
- } else
- {
- System.out.println("是天敌,初始化");//如果是天敌则初始化,再让第二只动物先过河
- initialization();
- oppositeBank.add(riverBank.get(count));
- riverBank.remove(count);
- }
- } else
- {
- System.out.println("标记不同,天敌过河一个");//当标记不同时,让此岸先存在的动物过河
- oppositeBank.add(riverBank.get(0));
- riverBank.remove(0);
- }
- } else
- {
- System.out.println("不是天敌,过河一个");//当不是天敌的时候,标记改变,并让第二只动物过河
- riverBank.get(0).setFlag(true);
- riverBank.get(1).setFlag(true);
- oppositeBank.add(riverBank.get(1));
- riverBank.remove(1);
- System.out.println("河岸有" + riverBank.size() + "只");
- }
- } else
- {
- if (oppositeBank.size() == 2)
- {
- System.out.println("对岸有2只");//判断对岸有几只动物
- if (oppositeBank.get(0).getEnemy()
- .equals(oppositeBank.get(1).getName())
- || oppositeBank.get(1).getEnemy().equals(oppositeBank
- .get(0).getName()))
- {
- System.out.println("是天敌");//判断是否是天敌,
- if ((oppositeBank.get(0).isFlag() != oppositeBank.get(1).isFlag()))
- {
- System.out.println("确定标记不相同,第一只过河");//判断标记是否不同,如果是则让此岸先存在的动物过河
- riverBank.add(oppositeBank.get(0));
- oppositeBank.remove(0);
- }
- } else
- {
- System.out.println("对岸不是天敌");//判断对岸是否天敌
- if ((oppositeBank.get(0).isFlag() == oppositeBank.get(1).isFlag()))
- {
- System.out.println("对岸标记相同");//如果是判断标记是否相同
- if (oppositeBank.get(0).isFlag() == true)
- {
- System.out.println("河岸最后一只过河");//标记相同,且被改变过则让河岸的最后一只动物过河
- oppositeBank.add(riverBank.get(0));
- riverBank.remove(0);
- System.out.println("河岸有" + riverBank.size()
- + "只动物");
- System.out.println("对岸有" + oppositeBank.size()
- + "只动物");
- System.out.println("过河结束");
- break;
- }
- }
- }
- }
- }
- }
- }
- }
- // 动物类
- class Animal {
- // 动物名称
- private String name;
- // 动物的天敌
- private String enemy;
- // 标记,确定标记不同,然后让其中一只动物过河
- private boolean flag = false;
- public Animal(String name, String enemy) {
- this.name = name;
- this.enemy = enemy;
- }
- public String getName() {
- return name;
- }
- public String getEnemy() {
- return enemy;
- }
- public boolean isFlag() {
- return flag;
- }
- public void setFlag(boolean flag) {
- this.flag = flag;
- }
- }
复制代码
|
|