A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© cuijinghao 中级黑马   /  2015-10-1 21:03  /  784 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.itheima;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

/*
*  第10题、一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
*  当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。
*  编程解决猫狗鱼过河问题。
*/
public class Test10 {
public static void main(String[] args) {
  //创建两个集合当做两个河岸
  List<String> left=new ArrayList<String>();
  List<String> right=new ArrayList<String>();
  //老农,狗,猫,鱼在左岸,
  Collections.addAll(left, "狗","猫","鱼","老农");
  int cishu=1;//渡河次数
  while(left.size()!=0){
   //次数为单数为老农左岸渡河到右岸,双数老农右岸渡河到左岸
   if(cishu%2==1){
    //老农随机带一个动物过河;
    left.remove("老农");
    Random random=new Random();
    int x=random.nextInt(left.size());
    String animal=left.get(x);
    //为了避免老农把刚从右岸带回的动物带回进行判断
    //如果cishu大于3,为最后一只动物,且左岸的动物数为2 说明这是刚从右岸带回的动物,重新选择一个
    if(cishu>3&&animal.equals(left.get(left.size()-1))&&left.size()==2){
     continue;
    }else{left.remove(animal);}
    //判断是否安全,安全则渡河,不安全则重新选择一只动物
    if(isSafe(left)&&isSafe(right)){
     right.add(animal);
     right.add("老农");
     System.out.println("老农第"+cishu+"次渡河把"+animal+"带到右岸");
     cishu++;
     System.out.println("渡河后右岸的动物:"+right );
     System.out.println("渡河后左岸的动物: "+left);
     if(right.contains("猫")&&right.contains("狗")&&right.contains("鱼")&&right.contains("老农")){System.out.println("老农、猫、狗、鱼成功渡河!");}
    }else{
     left.add(animal);
     left.add("老农");
    }
   }else{//老农回左岸
    right.remove("老农");
    //如果右岸的动物等于2种时才可能会发生危险,所以要带一只动物回左岸
    if(right.size()==2){
     //如果是鱼和狗则不会发生危险,老农自己返回左岸
     if(right.contains("鱼")&&right.contains("狗")){
      left.add("老农");
      System.out.println("老农第"+cishu+"次渡河自己回到左岸");
      cishu++;
      System.out.println("渡河后右岸的动物: "+right);
      System.out.println("渡河后左岸的动物: "+left);
     }else{
      //如果不是鱼和狗就会发生危险,老农带一种动物回左岸
      Random random=new Random();
      int y=random.nextInt(right.size());
      String animal2=right.get(y);
      //随机选择一种动物带回左岸,判断一下是否为刚从对岸带回来的动物,不是的话就带回左岸,
       if(!animal2.equals(right.get(right.size()-1))){
        right.remove(animal2);
        }else{continue;}
      
      if(isSafe(left)&&isSafe(right)){
       left.add(animal2);
       left.add("老农");
       System.out.println("老农第"+cishu+"次渡河把"+animal2+"带到左岸");
       cishu++;
       System.out.println("渡河后右岸的动物: "+right);
       System.out.println("渡河后左岸的动物:"+left);
       }
     }
    }else{//如果右岸只有一只动物老农自己返回左岸
     left.add("老农");
     System.out.println("老农第"+cishu+"次渡河自己回到左岸");
     cishu++;
     System.out.println("渡河后右岸的动物: "+right);
     System.out.println("渡河左右岸的动物: "+left);
    }
   }  
  }
}
//人猫狗鱼在一起时就不会发危险,所以定义猫狗鱼和谐相处的状态为true,猫狗鱼不和谐的时候为false
public static boolean isSafe(List<String> list){
  boolean flag =true;
  while(flag){
   if((!list.contains("老农"))&&list.contains("鱼")&&list.contains("猫")){
    flag=false;
   }else if((!list.contains("老农"))&&list.contains("猫")&&list.contains("狗")){
    flag=false;
   }
   break;
  }
  return flag;
}
}









4 个回复

正序浏览

haha 谢谢支持
回复 使用道具 举报
好贴    学习学习
回复 使用道具 举报

你要懂得一个菜鸟的心
回复 使用道具 举报
好复杂~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马