Java解决猫鱼问题
package weekend04;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Test2 {
public static void main(String[] args) {
ArrayList<String> left = new ArrayList<String>();
//定义左岸集合
ArrayList<String> right = new ArrayList<String>();
//定义右岸集合
left.add("狗"); left.add("鱼"); left.add("猫");
//把动物先加入到左岸集合中
String animal=null;
//定义一个变量来存放当前要送出去的动物
int count=0;
//定义个变量来存放老农过河的次数,单数为准备去右河岸,双数反之
Random r =new Random();
while(!left.isEmpty()) {
count++;
//每走一次就+1
animal=null;
//初始化下一次要送出去的动物
if(count%2==1)
//如果老农要去右岸
{
do//现在我采用的是随机挑选一个动物去右岸,直到不冲突为止
{ animal=left.remove(r.nextInt(left.size()));
//随机挑选一个动物
if(!cmpAnimal(left))
{ left.add(animal);
//如果送出去这个动物有冲突,就把他加回来重新挑选
} } while (!cmpAnimal(left));
//如果不为真,就代表冲突了,继续循环,直到不冲突为止
System.out.println("老农第"+count+"次,把"+animal+"送到了对岸...");
right.add(animal);
//循环结束后肯定返回的是一个没有冲突的动物
}else if(count%2==0)
//否则就是偶数,代表老农要从河岸回来
{ while(!cmpAnimal(right))
//这里不用dowhile因为从左岸送过来的至少有一个动物,不用担心冲突
{ animal=right.remove(r.nextInt(right.size()));
if(!cmpAnimal(right))
{
right.add(animal);
//如果发生冲突了,采用随机的方法挑选一个动物返回到到河对面去
} }
if(animal==null)
//如果挑选出来的动物等于null表示河岸不存在冲突的地方直接返回去
{
System.out.println("老农第"+count+"次,从河岸返回到了河对面...");
continue;
//如果没有动物就返回到循环开始
}
System.out.println("老农第"+count+"次,把"+animal+"送回到了河对面...");
//如果说冲突了,就把某个动物带到河对面去..
left.add(animal);
}
}
}
public static boolean cmpAnimal(List<String> list) {
if(list.contains("猫")&&list.contains("鱼")||list.contains("猫")&&list.contains("狗"))
{ return false;
//如果冲突了就返回假
}
return true;
//没冲突就返回真
}
}