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];
}
}
}