题目
农夫带着狼, 羊, 白菜过河
如果农夫没有在旁边看着它们, 狼就会吃羊, 羊会吃白菜
但是小船一次只能载一人一物
请用程序打印出农夫带它们过河的流程
分析
a岸 过河 b岸
1 人 狼 羊 菜 人 羊 --->
2 狼 菜 人 羊 //状态
3 狼 菜 <--- 人 羊
4 人 狼 菜 羊 //状态
5 菜 人 狼 ---> 羊
6 菜 人 狼 羊 //状态
7 菜 <--- 人 羊 狼
8 人 羊 菜 狼 //状态
9 羊 人 菜 ---> 狼
10 羊 人 狼 菜 //状态
11 羊 <--- 人 狼 菜
12 人 羊 狼 菜 //状态
13 人 羊 ---> 狼 菜
14 人 羊 狼 菜 //状态
"farmer", "sheep", "wolf", "vegetable" 在a岸为0 在b岸为1
--------------------------------------------------------------------------------------
0 0 0 0 人狼羊菜
1 1 0 0 狼菜 人羊
0 1 0 0 人狼菜 羊
1 1 1 0 菜 人狼羊
0 0 1 0 人羊菜 狼
1 0 1 1 羊 人狼菜
0 0 1 1 人羊 狼菜
1 1 1 1 人狼羊菜
代码
import java.util.Arrays;
public class Homework0506 {
static int[] con_a = { 0, 0, 0, 0 }; //表示过河前状态,0表示在a岸,1表示在b岸,初始都在a岸
static int[][] boat = { {1,1,0,0}, {1,0,1,0}, {1,0,0,1}, {1,0,0,0} }; //所有过河方式,1表示坐船
static int[] con_b = new int[4]; //表示过完河后的状态
static int[][] safe = { //列举安全的状态
//初始状态与最终状态
{0, 0, 0, 0}, {1, 1, 1, 1},
//农夫未过岸
{0, 0, 0, 1}, {0, 0, 1, 0}, //人狼同岸:人狼羊;人狼菜
{0, 1, 0, 0}, {0, 1, 0, 1}, //人羊同岸:人羊菜;人羊
//农夫过岸
{1, 1, 1, 0}, {1, 1, 0, 1}, //人狼同岸:人狼菜;人狼羊
{1, 0, 1, 1}, {1, 0, 1, 0}, //人羊同岸:人羊菜;人羊
};
public static void main(String[] args){
System.out.println("\t\t\t\t人\t狼\t羊\t菜");
System.out.print("初始状态:" + "\t");
array( con_a );
System.out.println("--------------开始---------------");
int count = 1; //用以统计执行次数
while ( con_a[0] + con_a[1] + con_a[2] + con_a[3] != 4 ){ //{1,1,1,1}为全到b岸,只要四者没有全部到b岸就一直过河
for (int i = 0; i < 4; i++){ //对四种过河方式进行遍历循环
System.out.println("第" + count++ + "轮坐船方案");
/*System.out.print("a岸情况:" + "\t");
array( con_a );*/
System.out.print("坐船:" + "\t\t");
array( boat[i] );
move(i, con_a, boat); //调用move()方法返回过完河后两岸状态
/*System.out.print("b岸情况:" + "\t");
array( con_b );*/
if ( isSafe(con_b) ){ //调用isSafe()方法判断过完河后是否都处于安全状态
System.out.println("该轮方案成功!");
print(); //如果都安全则调用print()方法对该次过河进行打印
change(); //调用change()方法将过完河后的状态赋值给过河前状态
System.out.println(); //换行
/*System.out.print("此时a岸为:" + "\t");
array( con_a );*/
}else{
System.out.println("该轮方案失败,尝试下一轮方案");
}
if(con_a[0] + con_a[1] + con_a[2] + con_a[3] == 4){ //判断,如果全部到岸,则退出程序
break;
}
System.out.println("---------------------------------");
}
}
System.out.println("过河成功!"); //所有人过完之后输出成功
}
//数组遍历
public static void array(int[] con) {
for(int p = 0; p < 4; p++){
System.out.print("\t" + con[p]);
}
System.out.println();
}
//坐船的方法
public static void move(int i, int[] con_a, int[][] boat ){
//System.out.println();
con_b[0] = ( con_a[0] + boat[i][0] ) % 2;
con_b[1] = ( con_a[1] + boat[i][1] ) % 2;
con_b[2] = ( con_a[2] + boat[i][2] ) % 2;
con_b[3] = ( con_a[3] + boat[i][3] ) % 2;
}
//判断安全的办法
public static boolean isSafe(int[] con_b){
for(int i = 0; i < safe.length; i++ ) {
if ( Arrays.equals(con_b, safe[i]) ) { //传入的数组与isSafe数组相同,即安全
return true;
}
}
return false;
}
//打印的办法
public static void print(){ //编写print()方法对该次过河进行打印
if ( con_b[0] == 1 ){
System.out.print("从A岸到B岸:");
}else{
System.out.print("从B岸到A岸:");
}
//状态改变即坐船
if( con_b[0] != con_a[0] ){
System.out.print("人");
}
if( con_b[1] != con_a[1] ){
System.out.print("带狼");
}
if( con_b[2] != con_a[2] ){
System.out.print("带羊");
}
if( con_b[3] != con_a[3] ){
System.out.print("带白菜");
}
System.out.print("过河");
}
//状态变化
public static void change(){
for (int i = 0; i < 4; i++){
con_a[i] = con_b[i]; //过河后更换岸边状态,过河所到岸为当前岸
}
}
}
运行结果
人 狼 羊 菜
初始状态: 0 0 0 0
--------------开始---------------
第1轮坐船方案
坐船: 1 1 0 0
该轮方案失败,尝试下一轮方案
---------------------------------
第2轮坐船方案
坐船: 1 0 1 0
该轮方案成功!
从A岸到B岸:人带羊过河
---------------------------------
第3轮坐船方案
坐船: 1 0 0 1
该轮方案失败,尝试下一轮方案
---------------------------------
第4轮坐船方案
坐船: 1 0 0 0
该轮方案成功!
从B岸到A岸:人过河
---------------------------------
第5轮坐船方案
坐船: 1 1 0 0
该轮方案成功!
从A岸到B岸:人带狼过河
---------------------------------
第6轮坐船方案
坐船: 1 0 1 0
该轮方案成功!
从B岸到A岸:人带羊过河
---------------------------------
第7轮坐船方案
坐船: 1 0 0 1
该轮方案成功!
从A岸到B岸:人带白菜过河
---------------------------------
第8轮坐船方案
坐船: 1 0 0 0
该轮方案成功!
从B岸到A岸:人过河
---------------------------------
第9轮坐船方案
坐船: 1 1 0 0
该轮方案失败,尝试下一轮方案
---------------------------------
第10轮坐船方案
坐船: 1 0 1 0
该轮方案成功!
从A岸到B岸:人带羊过河
过河成功!