今天在论坛上看到一个很有意思的题目:
一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。
这个问题最大难点就在于逻辑判断,其实代码很简单。现在把自己的代码贴上来,以供饭后消遣:
package com.codeWrite;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class FamerCrossRiver {
public void crossRiver() throws Exception{
List<String> bc =new ArrayList<String>();//未过河的动物列表
List<String> ac =new ArrayList<String>();//已过河的动物列表
bc.add("猫");
bc.add("狗");
bc.add("鱼");
String fm ="农夫";
int time =0;//过河次数
String ra=RelaAnimal.猫.name(); //关联动物是猫
String cn=null; //当前准备和农夫一起过河的动物
while(bc.size()>0){
time++;
System.out.println("现在有"+bc.size()+"只动物准备和农夫过河");
sop("这些动物分别是:");
for(String each:bc){
System.out.print(each+" ");
}
System.out.println();
if(ac.size()==0){ //第一次过河要带猫过河
cn =ra;
bc.remove(ra);
}
else if(bc.size()>1&bc.contains(ra)&ac.size()!=0){//当没过河的动物不止一只且包括猫存在时
ListIterator<String> ii =bc.listIterator();
while(ii.hasNext()){
String now=ii.next();
if(!now.equals(ra)){
cn=now;
}
}
bc.remove(cn);
}else if(bc.size()==1&bc.contains(ra)){ //当没过河的动物中只剩猫的时候
cn =ra;
bc.remove(ra);
}else{ //如果没过河的动物中没有猫,那么随意取一个动物跟随农夫过河
cn =bc.get(0);
bc.remove(0);
}
System.out.println("第"+time+"次:"+fm+"过河...带上"+cn+",过河中...");
Thread.sleep(2000);
ac.add(cn);
if(bc.size()!=0){ //当还有动物没过河的情况下,农夫需要再次返回。
time++;
if(ac.size()!=1&ac.contains(ra)){ //如果河对岸有不止一只动物且包括猫的话就要带猫回去
ac.remove(ra);
System.out.println("第"+time+"次:"+fm+"准备返回...带上"+ra+",过河中...");
Thread.sleep(2000);
bc.add(ra);
}else{
System.out.println("第"+time+"次:"+fm+"准备返回...,过河中...");
Thread.sleep(2000);
}
}
sop("河对岸留下了:"+ac.size()+"只动物,分别是:");
for(String each:ac){
System.out.print(each+" ");
}
System.out.println();
}
sop("所有动物被农夫带过河了...");
}
public void sop(Object obj){
System.out.println(obj.toString());
}
public static void main(String[] args) throws Exception{
FamerCrossRiver fcr =new FamerCrossRiver();
fcr.crossRiver();
}
}
enum RelaAnimal{
猫("猫");
private RelaAnimal(String msg){
}
} |