农夫过河+java,农夫过河问题(java版)
packagecom.my.courseDesign;public classCourseDesign {/** 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 voidmain(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];
}
}
}
總結
以上是生活随笔為你收集整理的农夫过河+java,农夫过河问题(java版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 打印带颜色的字符
- 下一篇: 互联网日报 | 网易回港二次上市首日涨5