我觉得我写的不错
- package com.itheima;
- import java.util.ArrayList;
- public class Test10 {
-
- String person = "person";
- String dog = "dog";
- String cat = "cat";
- String fish = "fish";
-
- String animal,animal2; // 后面用于得到集合中元素的临时变量
-
- // bank opbank 分别表示河岸和对岸
- ArrayList<String> bank = new ArrayList<String>();
- ArrayList<String> opbank = new ArrayList<String>();
-
- // 初始化河岸,让人、猫、狗、鱼位于河岸, 顺序可以改变
- public Test10() {
-
- bank.add(person);
- bank.add(dog);
- bank.add(fish);
- bank.add(cat);
-
- }
-
- // 判断和谐条件
- public boolean isSafety(ArrayList<String> list) {
-
- // 人在和谐
- if(list.contains(person)) {
- return true;
- }
-
- // 人不在, 猫狗或猫鱼同在不和谐
- else if(list.contains(dog) && list.contains(cat) ||
- list.contains(cat) && list.contains(fish)) {
- return false;
- }
- // 其他条件和谐,如何集合为空,说明岸上没有动物,自然也和谐
- return true;
- }
-
- // 人带一只动物带到对岸
- public boolean toOpbank(String animal) {
-
- bank.remove(person);
- bank.remove(animal);
- // 人走后岸边和谐,则去对岸
- if(isSafety(bank)) {
- opbank.add(person);
- opbank.add(animal);
- System.out.println("老农把" + animal + "带到对岸");
- return true;
-
- // 岸边不和谐,则回来
- } else {
- bank.add(animal);
- bank.add(person);
- return false ;
- }
- }
-
- // 如果人走后对岸和谐,人则自己回到岸边继续送其他动物
- public boolean toBank() {
-
- opbank.remove(person);
- if(isSafety(opbank)) {
- bank.add(person);
- System.out.println("老农一个人回到岸边");
- return true;
- } else {
- opbank.add(person);
- return false;
- }
-
- }
-
- // 如果人走后对岸不和谐,人将带一只动物回岸边
- public boolean toBank(String animal) {
-
- opbank.remove(person);
- opbank.remove(animal);
- if(isSafety(opbank)) {
- bank.add(person);
- bank.add(animal);
- System.out.println("老农带着" + animal + "回到岸边");
- return true;
-
- } else {
- opbank.add(animal);
- opbank.add(person);
- return false;
- }
- }
-
-
- // 开始渡河
- public void crossRiver() {
-
- // 岸边集合为空,则渡河成功
- if(bank.isEmpty()) {
- System.out.println("渡河成功");
- return ;
- }
-
- // 每次都带岸边集合中第一只不是人的动物去对岸
-
- animal = bank.get(0);
- if(person.equals(animal)) {
- animal = bank.get(1);
- }
- if(toOpbank(animal)){
-
- // 人如果可以自己回来就自己回来,不能则带对岸集合第一只不是人的动物回来
-
- animal2 = opbank.get(0);
- if(person.equals(animal2)) {
- animal = opbank.get(1);
- }
-
- if(!toBank()) {
- toBank(animal2);
- }
- }
-
- // 递归渡河,直到岸边集合为空
- crossRiver();
- }
-
- public static void main(String[] args) {
-
- new Test10().crossRiver();
- }
- }
复制代码 |