• 农夫过河问题(java版)


    问题描述:
    一个农夫带着一只狼、一只羊、一只白菜,身处河南岸,要把全部东西带到北岸。问题是只有一条小船,船只能容纳他和一件东西,且狼吃羊,羊吃白菜。问:农夫怎样才能将所有东西安全带到河对岸。

    代码实现:

    package com.my.courseDesign;
    
    public class CourseDesign {
        /*
        * 1.   首先分为A岸,和B岸,A岸用0来表示,B岸用1来表示,在船上用1来表示,不再船上用0表示
        * 2.   分别创建两个大小为4数组分别用来表示过河前和过河后的状态coast[4],cross[4],
        *      再创建一个二维数组表示存储过河方式boat[][]
        * 3.   经过分析符合岸上安全的情况为{0,0,0,0}、{1,1,1,1}、{1,0,1,0}、{1,1,1,0}、
        *      {1,1,0,1}、{1,0,1,1}、{0,1,0,0}、{0,0,1,0}、{0,0,0,1}、{0,1,0,1}十种情况,
        *      过河有{1,0,0,0}{1,1,0,0}{1,0,1,0}{1,0,0,1}四种情况
        *      经过分析发现如果假设:1(船)+1(岸)=0,0(船)+0(岸)=0,0(船)+1(岸)=1,1(船)+0(岸)=1成立则过完河
        *      之后的情况正好是四者过完河后在岸上的状态,思考后发现可以用求余的方式来实现
        * 4.   创建一个方法返回过完河后两岸状态
        * 5.   创建一个方法来判断过完河后状态是否为安全状态,如果不是则接着遍历,是的话则打印过河状态
        * 6.   创建一个方法对该次过河进行打印
        * 7.   创建一个方法将过完河后的状态赋值给过河前状态
        * 8.   通过循环遍历对过河进行实现
        *
        *
        *
        * */
        static int[] coast={0,0,0,0};   //表示过河前状态
        static int[][] boat={{1,1,0,0},{1,0,1,0},{1,0,0,1},{1,0,0,0}};  //所有过河方式
        static int[] cross=new int[4];   //表示过完河后的状态
        public static void main(String[] args){
            while (coast[0]+coast[1]+coast[2]+coast[3]!=4){  //只要四者没有全部到B岸就一直过河
                for (int i=0;i<4;i++){      //对四种过河方式进行对比
                    nextCoast(i,coast,boat);    //调用nextCoast()方法返回过完河后两岸状态
                    if (isSafe(cross)){   //调用isSafe()方法判断过完河后是否都处于安全状态
                        print();    //如果都安全则调用print()方法对该次过河进行打印
                        exchangCoast();   //调用exchangCoast()方法将过完河后的状态赋值给过河前状态
                        System.out.println();   //换行
                    }
                }
            }
            System.out.println("过河成功!");   //所有人过完之后输出成功
        }
        public static void nextCoast(int i,int[] coast,int[][] boat){  //编写nextCoast()方法返回过完河后两岸状态
            cross[0]=(coast[0]+boat[i][0])%2;     //通过取余来实现做出的设定
            cross[1]=(coast[1]+boat[i][1])%2;
            cross[2]=(coast[2]+boat[i][2])%2;
            cross[3]=(coast[3]+boat[i][3])%2;
        }
        public static boolean isSafe(int[] cross){    //编写isSafe()方法判断过完河后是否都处于安全状态
            if(       //对10种安全的情况依次做对比
                (cross[0]==1 && cross[1]==1 && cross[2]==1 && cross[3]==1) ||
                (cross[0]==0 && cross[1]==0 && cross[2]==0 && cross[3]==0) ||
                (cross[0]==1 && cross[1]==0 && cross[2]==1 && cross[3]==0) ||
                (cross[0]==1 && cross[1]==1 && cross[2]==1 && cross[3]==0) ||
                (cross[0]==1 && cross[1]==1 && cross[2]==0 && cross[3]==1) ||
                (cross[0]==1 && cross[1]==0 && cross[2]==1 && cross[3]==1) ||
                (cross[0]==0 && cross[1]==1 && cross[2]==0 && cross[3]==0) ||
                (cross[0]==0 && cross[1]==0 && cross[2]==1 && cross[3]==0) ||
                (cross[0]==0 && cross[1]==0 && cross[2]==0 && cross[3]==1) ||
                (cross[0]==0 && cross[1]==1 && cross[2]==0 && cross[3]==1)
            ){
                return true;
            }else{
                return false;
            }
        }
        public static void print(){    //编写print()方法对该次过河进行打印
            if (cross[0]==1){
                System.out.print("从A岸到B岸:");
            }else{
                System.out.print("从B岸到A岸:");
            }
            if(cross[0]!=coast[0]){
                System.out.print("人");
            }
            if(cross[1]!=coast[1]){
                System.out.print("带狼");
            }
            if(cross[2]!=coast[2]){
                System.out.print("带羊");
            }
            if(cross[3]!=coast[3]){
                System.out.print("带白菜");
            }
            System.out.print("过河");
        }
        public static void exchangCoast(){   //编写exchangCoast()方法将过完河后的状态赋值给过河前状态
            for (int i=0;i<4;i++){
                coast[i]=cross[i];
            }
        }
    }

    运行结果展示:

    从A岸到B岸:人带羊过河
    从B岸到A岸:人过河
    从A岸到B岸:人带狼过河
    从B岸到A岸:人带羊过河
    从A岸到B岸:人带白菜过河
    从B岸到A岸:人过河
    从A岸到B岸:人带羊过河
    过河成功!
  • 相关阅读:
    对PostgreSQL中bufmgr.c 中 bufs_to_lap的初步理解
    bgwriter 的睡眠时间差异
    对PostgreSQL中bufmgr.c 中 num_to_scan 的初步理解
    对PostgreSQL中bufmgr.c的进一步学习
    PHP 接收长url并重定向
    Request.ServerVariables小结
    Kiss Asp Framework 0.2.0RC Releaseed
    FLV编码、转换、录制、播放方案
    ASP错误信息
    Gzip简介
  • 原文地址:https://www.cnblogs.com/shenzhenhuaya/p/15226181250_shenzhenhua0211.html
Copyright © 2020-2023  润新知