黑马程序员技术交流社区

标题: 农夫与鱼 [打印本页]

作者: 我类个去    时间: 2016-5-27 10:34
标题: 农夫与鱼
package com.itheima;
//一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
//当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。
import java.util.ArrayList;
import java.util.List;
public class Test10{
        static List<String> start = new ArrayList<String>();// 定义两边河岸,存放,带过去的动物,和剩下的动物
        static List<String> finish = new ArrayList<String>();
        static List<String> ship = new ArrayList<String>();
        static boolean farmers (List<String> y){
                if(y.contains("farmer")){
                return false;
    }else{
            return true;
    }
        }
        public static boolean safe (List<String> x){
                if(x.contains("cat")&&x.contains("dog")&&x.contains("farmer")==false
                                ||x.contains("cat")&&x.contains("fish")&&x.contains("farmer")==false){//做一个安全判断
                        return false;//如果包含猫狗或猫鱼组合返回false;
                }else{
                        return true;
                }
        }
        public static void main(String[] args){
                String first=null;
                start.add("dog");//起点加入三种动物和农民
                start.add("fish");
                start.add("cat");
        for(int i=0;i<start.size();i++){//循环重置岸边的动物并按脚标顺序假设带走
                String temp=start.get(i);//设定假定带走的动物
                start.remove(temp);//假如带走的动物
                if(safe(start)){//当岸边安全时
                        System.out.println("我们先带走"+temp);
                        System.out.println("岸边还剩"+start);
                        first=temp;//确定满足条件的动物为确定带走的动物
                        break;//假如不止一种动物满足岸边安全条件,但是实际上真正一次只能带走一只动物
                              //所以第一个满足条件的动物讲被带走,结束循环
                }
                start.add(i,temp);//循环结束前再将假定被带走的动物安原位放置回岸边,以便保持岸边动物
                                  //所对应的脚标不变
               
        }
        start.remove(first);
        ship.add(first);//将这个满足条件的动物带上船
        if(safe(finish)){
                finish.add(first);//将这个满足条件的动物放下来
                System.out.println("岸边安全,农夫不需要下船");
                System.out.println("将"+first+"放到对岸后农夫自己又回到起始岸");
        }       
        int x=0;//不满足条件个数
        System.out.println("首先假设重复第一次渡河过程,农夫放下动物后独自离开");
        for(int i=0;i<start.size();i++){
                String temp=start.get(i);//按脚标顺序设定假定带走的动物
                start.remove(temp);//将其带离岸边
                finish.add(temp);//动物上岸
                if(safe(start)&&safe(finish)){
                        System.out.println("将"+temp+"放到对岸后农夫自己又回到起始岸");
                }else {//如果不满足安全条件
                        x++;//不满足条件个数+1
                        finish.remove(temp);//复位
                        start.add(i,temp);
                        System.out.println("得出结论将"+temp+"带走并放置在对岸农夫独自离开不安全");
                        }
                }
        if(x==start.size()){
                System.out.println("将动物放置对岸后农夫不能独自离开,需要带动物返程");
                System.out.println("复位至从第二次离开起始岸开始");
        }
                String a=start.get(0);//任意带走一个动物
                start.remove(a);//将其带离河对岸
                finish.add(0,a);//让动物上岸
                System.out.println("当船第二次离开起始岸时岸边时,带走"+a+"目前岸留有"+start);
                //System.out.println(finish.size());
        for(int i=0;i<finish.size();i++){
                String temp=finish.get(i);
                finish.remove(temp);
                System.out.println("当船第二次离开终点岸时时,带走"+temp+"目前终点岸留有"+finish);
                String b=(start.get(0));//将岸边剩下唯一的动物标定
                start.add(temp);//动物回起始岸
                start.remove(b);//将之前标定的动物带离岸边
                System.out.println("当船第三次次离开起始岸边时,带走"+b+"目前起始岸留有"+start);
                finish.add(b);
                if(safe(finish)){//假如终点安全
                        System.out.println("一次成功的运送,终点岸目前有"+finish+"起点岸有"+start);
                        break;
                }else{
                finish.add(i,temp);//复位
                finish.remove(b);
                start.remove(temp);
                start.add(b);
                System.out.println("这次运送不成功,复位,改为从终点带回"+finish.get(i+1));
                }
                        }
                String last=start.get(0);
                start.remove(last);
                if(start.isEmpty()){
                        System.out.println("最后把"+last+"带走");
                }
                        }

        }






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2