問題描述:
一個農夫帶着一只狼、一只羊、一只白菜,身處河南岸,要把全部東西帶到北岸。問題是只有一條小船,船只能容納他和一件東西,且狼吃羊,羊吃白菜。問:農夫怎樣才能將所有東西安全帶到河對岸。
代碼實現:
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岸:人帶羊過河
過河成功!