農夫過河問題(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岸:人帶羊過河
過河成功!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM