- <p>[hide]题目十: 一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。[/hide]</p><p>import java.util.List;
- 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;
- }
- }
- </p>
复制代码
|
|