怎么样放弃一个人人 要过河只有一条船 要带3样东西...

maple编程:野人传教士过河问题.有三个野人和三个传教士过河,只有一条船,可以同时载三个人.要求任何时候,包括在岸上和在船上,野人数目不能大于传教士数目.用maple给出一个安全的过河过程.
为您推荐:
其他类似问题
扫描下载二维码想一想.一个人要过河,他随身带着一条狗,一只鸡和一棵白菜.河边有一条船,小船一次只能让带一样东西过河.问题是没有人的情况下,狗食鸡,鸡食白菜,怎样才能安全过河呢?
waggas2341
先把鸡带过去 回来把白菜带过去 带回鸡来把狗带过去 回来带过鸡去 成功
为您推荐:
其他类似问题
先带鸡过河,再回来带狗过河,顺便把鸡带回来,然后把白菜带过去,再回来把鸡带过去。
先把鸡带过去,回来再把狗带过去鸡带回来,再把白菜带过去,最后回来把鸡带过去。
扫描下载二维码*/import java.util.*;public class Test4{
/**内部类,用来把保存过河过程中的路线和状态.
to为ture表示去对岸,否则表示从对岸返回。同时true也表示船在本岸,false表示船在对岸.
busiMansInBoat为在船里的商人数.
servsInBoat为船里的仆人数.
residualBusiMans为岸上的商人数,to为true时,表示是本岸.
residualServants为岸上的仆人数,to为true时,表示是本岸.
static class Path{
int busiMansInB
int servsInB
int residualBusiM
int residualS
Path(boolean to,int bmib,int sib,int rb,int rs){
busiMansInBoat=
servsInBoat=
residualBusiMans=
residualServants=
/*比较两个状态是不是相同.
public boolean equals(Path p){
if(to==p.to){
return busiMansInBoat==p.busiMansInBoat&&servsInBoat==p.servsInBoat
&&residualBusiMans==p.residualBusiMans&&residualServants==p.residualS
}else if(to){
return busiMansInBoat==p.busiMansInBoat&&servsInBoat==p.servsInBoat
&&residualBusiMans==3-p.residualBusiMans-p.busiMansInBoat&&residualServants==3-p.residualServants-p.servsInB
return busiMansInBoat==p.busiMansInBoat&&servsInBoat==p.servsInBoat
&&3-residualBusiMans-busiMansInBoat==p.residualBusiMans&&3-residualServants-servsInBoat==p.residualS
public String toString(){
return "本岸(商人"+residualBusiMans+"个,仆人"+residualServants+"个)-----&"
+"[船上:"+busiMansInBoat+"个商人,"+servsInBoat+"个仆人]-----&"
+"对岸(商人"+(3-residualBusiMans-busiMansInBoat)+"个,仆人"+(3-residualServants-servsInBoat)+"个)";
return "本岸(商人"+(3-residualBusiMans-busiMansInBoat)+"个,仆人"+(3-residualServants-servsInBoat)+"个)&-----"
+"[船上:"+busiMansInBoat+"个商人,"+servsInBoat+"个仆人]&-----"
+"对岸(商人"+residualBusiMans+"个,仆人"+residualServants+"个)";
//保存路线的List
public static List&Path& pathList=new ArrayList&Path&();
/**过河方法.
* @param businessmans 商人数.
* @param servants
* @param schemes
* @param to
去还是返回,同时也表示是否在对岸.
public static void passRiver(int businessmans,int servants,int[][] schemes,boolean to){
if(!to&&businessmans==3&&servants==3){
System.out.println("结果");
for(Path p : pathList){
System.out.println(p);
int schemesStart=0;
//从方案集中的那一种方案开始选择.
schemesStart=2;
//如果在本岸,则从第3种方案开始选择.
for(int i=schemesSi&schemes.i++){
int residualBusiMans=businessmans-schemes[i][0];
//按照方案岸上所剩商人数.
int residualServants=servants-schemes[i][1];
//按照方案岸上所剩仆人数.
if(residualBusiMans&0||residualServants&0){
//如果商人数或仆人数小于0,重新选择方案.
if(residualBusiMans!=0&&residualBusiMans&residualServants){
//如果仆人数大于商人数,重新选择方案.
if(3-residualBusiMans!=0&&3-residualBusiMans&3-residualServants){
//如果对岸的仆人数大于商人数,重新选择方案.
//按本方案,生成路线.
Path p=new Path(to,schemes[i][0],schemes[i][1],residualBusiMans,residualServants);
if(!isRepeat(p)){
//如果没有重复.
pathList.add(p);
passRiver(3-residualBusiMans,3-residualServants,schemes,!to); //从对岸返回.
pathList.remove(pathList.size()-1);
/**看看当前的路线是不是和以前的重复了.
public static boolean isRepeat(Path p){
boolean repeat=false;
for(Path temp : pathList){
if(temp.equals(p)){
repeat=true;
public static void main(String[] args)throws Exception{
//过河方案,每一种方案为一个一组数组,比如{1,0}表示船上要坐1个商人和0个仆人。方案可以用一个方法来生成:
int[][] sckemes={{1,0},{0,1},{1,1},{2,0},{0,2}};
passRiver(3,3,sckemes,true);
}}/*本算法只能解决3个商人和3个仆人,不俱通用性.*/
阅读(...) 评论()一个人带着一只狼,一只羊和一捆白菜过河,河边只有一条小船,一次只能带一样东西过河。如果人不在,狼要吃羊,羊要吃白菜。请你想一想,既不让狼吃羊,又不让羊吃白菜,他该怎样安排过河?
xinel-simpso
先把羊带过去,在回来,再随便带,就这样循环。
你的回答完美的解决了我的问题,谢谢!
为您推荐:
扫描下载二维码一个人带了一只狼、一只羊和一筐白菜过一条河,可是船太小,每次他只能带一样东西过河,如果他不在,狼要_百度知道
一个人带了一只狼、一只羊和一筐白菜过一条河,可是船太小,每次他只能带一样东西过河,如果他不在,狼要
每次他只能带一样东西过河。请问、一只羊和一筐白菜过一条河,可是船太小,羊要吃白菜:他应该如何摆渡,如果他不在一个人带了一只狼,才能安全地把三样东西带过河,狼要吃羊
我有更好的答案
第三次,马到成功!,带羊!。同学你好有帮助请点采纳或者右上角好评~祝你新的一年学习进步,把羊带回来。第二次带狼过去。第四次,带白菜过去第一次带羊
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 怎么样放弃一个人 的文章

 

随机推荐