java农夫过河_农夫过河问题(java版)

这是一个使用Java解决经典农夫过河问题的程序。通过创建数组表示过河前后状态,利用取余运算判断安全状态,并遍历所有可能的过河方式,直到所有人都到达对岸。程序包括状态更新、安全检查、过河情况打印等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值