package com.itheima;
import java.util.ArrayList;
import java.util.List;
/**10、 一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,
则不会发生这种问题。编程解决猫狗鱼过河问题。*/
/**
2、定义函数检查当河岸边动物在无老农情况下是否产生动物损失情况;
*/
public class Test10 {
public static void main(String[] args) {
/**1、建立两个字符串集合ArrayList来存储河岸两边的动物们,
初始时,动物全在河左岸,最终目的是要将河左岸的动物全部运到河右岸;*/
List<String> left = new ArrayList<String>();
List<String> right = new ArrayList<String>();
left.add( "猫" );
left.add( "狗" );
left.add( "鱼" );
//定义使用船的次数
int useBoat = 0;
String animal = null;
// 4、如果河左岸动物为空,则循环结束。
while( !left.isEmpty() ){
useBoat++;
animal = null;
/**当船使用次数为单数时老农在河右岸,只要老农带走的动物后剩下的动物不产生损失,
即将带走的动物添加去河右岸集合中;*/
if( 1 == useBoat % 2 ){
for( int i = 0; i < left.size(); i++ ){
animal = left.remove( i );
if( lossAnimal(left) ){
left.add( animal );
continue;
}else{
break;
}
}
System.out.println( "第" + useBoat + "次, 老农用船将" + animal + "运到河右岸" );
right.add( animal );
/**船使用次数为偶数时老农在河左岸;如果河右岸动物们不会产生损失,
则老农不带动物回到左岸,否则带走动物保证河右岸动物的安全,将带走动物放回左岸。*/
}else {
while( lossAnimal(right) ){
for( int i = 0; i < right.size(); i++ ){
animal = right.remove( i );
if( lossAnimal(right) ){
right.add( animal );
continue;
}else{
break;
}
}
}
if( animal == null ){
System.out.println( "第" + useBoat + "次, 老农用船回到河左岸" );
}else{
System.out.println( "第" + useBoat + "次, 老农用船将" + animal + "运回河左岸" );
left.add( animal );
}
}
}
}
public static boolean lossAnimal( List<String> list ){
if( list.contains("猫") && list.contains("狗") ){
return true;
}else if( list.contains("猫") && list.contains("鱼") ){
return true;
}else{
return false;
}
}
} |
|