import java.util.ArrayList;
public class Test10 {
public static void main(String[] args) {
crossRiver();
}
public static void crossRiver()
{
//创建ArrayList对象leftBank和rightBank分别用来存储河岸两边的动物
List<String> leftBank = new ArrayList<String>();
leftBank.add("fish");
leftBank.add("cat");
leftBank.add("dog");
List<String> rightBank = new ArrayList<String>();
boolean isAtLeftBank = true; //农夫在左岸
String animal = ""; //老农带走的动物
//当左岸没有动物时循环结束
while(!leftBank.isEmpty())
{
//老农在左岸,如果带走一只动物后左岸的动物有危险,则不带走,否则将动物添加到右岸中
if (isAtLeftBank)
{
for (int i = 0; i < leftBank.size(); i++)
{
animal = leftBank.remove(i);
//如果剩下动物存在危险,把不能被带走的动物重新添加到原来的位置
if (AtRisk(leftBank))
{
leftBank.add(i, animal);
continue;
}
else
{
rightBank.add(animal);
System.out.println("老农带"+animal+"过河");
break ; //跳出for循环
}
}
isAtLeftBank = false;
}
/* 老农在右岸,如果此时右岸的动物没有危险,则老农独自一人回去
* 否则需从右岸动物中选一只带走,判断余下的动物是否危险,
*/
else
{
if (AtRisk(rightBank))
{
for (int i = 0; i < rightBank.size(); i++) {
animal = rightBank.remove(i);
if (AtRisk(rightBank))
{
rightBank.add(i, animal);
continue;
}
else
{
leftBank.add(animal);
System.out.println("老农带"+animal+"回来");
break;
}
}
}
else
{
System.out.println("老农独自回来");
}
isAtLeftBank = true;
}
}
System.out.println("过河成功!");
}
/*
* 定义AtRisk方法,判断岸边的动物是否存在危险
* 岸边同时有狗和猫,或猫和鱼时,返回true,否则返回false
*/
public static boolean AtRisk(List<String> list){
if (list.contains("dog") && list.contains("cat"))
return true;
else if (list.contains("fish") && list.contains("cat"))
return true;
else
return false;
}
} |
|