A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 汪伟楠 于 2014-1-11 11:59 编辑

package com.itheima;
import java.util.ArrayList;
/**
* 第10题:一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
* 当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。
* 编程解决猫狗鱼过河问题.
* @param args
*/
//思路:先带猫过去,然后回来把狗带过,把猫带回来,再把鱼带过去,再回来带猫.
public class Test10 {

public static void main(String[] args) {
  new Test10().tohere();
}
  //创建一个集合,代表起始点.
  ArrayList<String> here = new ArrayList<String>();
  //创建一个集合,代表终点.
  ArrayList<String> there = new ArrayList<String>();
  //添加元素.
  public Test10() {
   here.add("Dog");
   here.add("cat");
   here.add("fish");
  }
  //定义一个方法,用来判断这三个动物之间关系.
  public boolean isSafe(ArrayList<String> al) {
   if (al.contains("dog") && al.contains("cat")
     || al.contains("cat") && al.contains("fish")) {
    return false;
   }
   return true;
  }
  //定义一个方法,将起点的元素送到终点.
  public void tohere() {
   String str = here.get(0);
   here.remove(str);
   if (isSafe(here)) {
    System.out.println("1农夫带着" + str + "去往对岸,这边还剩下" + here + ",对岸有"
      + there);
    toThere(str);
   } else {
    here.add(str);
    tohere();
   }
  }
  //定义一个方法,用来查看终点的元素.
  public void toThere(String s) {
   
   if (isSafe(there)) {
    there.add(s);
    if(here.isEmpty()){
     System.out.println("4农夫,"+there+"都被你带过来了");
     return;
    }
    if(isSafe(there)){
     System.out.println("2农夫回到原点,对岸有" + there);
     tohere();
    }else{
     String temp=there.get(0);
     there.remove(temp);
     System.out.println("3农夫带着"+temp+"回到原点,这边有" + here + ",对岸有" + there);
     here.add(temp);
     tohere();
    }
   } else {
    there.remove(s);
    tohere();}
   }
}

5 个回复

正序浏览
  1. package com.itheima;

  2. import java.util.ArrayList;


  3. public class River3 {
  4.        
  5.        
  6.         //此变量用来标示正确的步数,
  7.         public static int count=1;
  8.         /**
  9.          * @param args
  10.          *
  11.          * 思路:
  12.          *
  13.          * 1,狗用“狗猫”代替,猫用”猫鱼“代替,鱼用“鱼儿”代替,首字符代表自己,
  14.          * 尾字符代表其食物;方便互斥判断
  15.          * 2,new两个ArrayList<string>:Left和Right,分别代表河左岸,右岸;
  16.          *,3,Left中存储三个动物,都移到Right集合则完成任务;
  17.          * 4,
  18.          */
  19.         public static void main(String[] args) {
  20.                 // TODO Auto-generated method stub
  21.                 String[] arr={"狗","猫","鱼"};
  22.                
  23.                
  24.                 //字符替换动作,方便做互斥判断,
  25.                 for(int i=0;i<arr.length;i++){
  26.                         if(arr[i].equals("狗"))
  27.                                 arr[i]="狗猫";
  28.                         else{
  29.                                 if(arr[i].equals("猫"))
  30.                                         arr[i]="猫鱼";
  31.                                 else{
  32.                                         if(arr[i].equals("鱼"))
  33.                                                 arr[i]="鱼儿";
  34.                                 }
  35.                         }
  36.                 }

  37.                
  38.                 ArrayList<String> lift=new        ArrayList<String>();
  39.                 ArrayList<String> right=new ArrayList<String>();
  40.        
  41.        
  42.                 //各动物到达左岸;
  43.                 for(String s : arr){
  44.                         lift.add(s);
  45.                 }
  46.                 System.out.println("各动物到达左岸,准备渡河:");
  47.                 show(lift,right);
  48.                 System.out.println();
  49.                
  50.                
  51.                
  52.                 //开始渡河,若右岸集合有三个元素,任务完成程序结束
  53.                 while(right.size()!=3){
  54.                         String animal=lift.remove(0);
  55.                        
  56.                         //左岸移出,右岸添入;
  57.                         right.add(animal);
  58.                        
  59.                        
  60.                        
  61.                         //调用test()方法,测试两集合的互斥情况,返回布尔值进行处理;
  62.                         //发生互斥,右岸移回一个动物,否则不做任何动作,程序继续;
  63.                        
  64.                         if(!test(lift)){
  65.                                 animal=right.remove(0);
  66.                                 lift.add(animal);                               
  67.                         }else{
  68.                                 System.out.println(animal.charAt(0)+"送到右岸!"+"第"+(count++)+"步!");
  69.                                 show(lift,right);
  70.                         }
  71.                                
  72.                         if(!test(right)){
  73.                                 System.out.println(right.get(0).charAt(0)+"送回左岸!"+"第"+(count++)+"步!");
  74.                                 animal=right.remove(0);
  75.                                 lift.add(animal);
  76.                                 show(lift,right);
  77.                         }
  78.                        
  79.                 }
  80.                 System.out.println("所有动物来到了右岸!!");
  81.         }
  82.        
  83.        
  84.         //两集合进行互斥处理;
  85.         public static boolean test(ArrayList<String> list){
  86.                 boolean b=true;
  87.                 if(list.size()==3)
  88.                         return b;
  89.                 String s1="";
  90.                 String s2="";
  91.                 if(list.size()==2){
  92.                         s1=list.get(0);
  93.                         s2=list.get(1);
  94.                        
  95.                                 if(s1.contains(s2.charAt(1)+"")){
  96.                                         b=false;
  97.                                 }
  98.                                 if(s2.contains(s1.charAt(1)+"")){
  99.                                         b=false;
  100.                                 }
  101.                 }
  102.                 return b;
  103.         }
  104.        
  105.        
  106.         public static void show(ArrayList<String> lift,ArrayList<String> right){
  107.                 StringBuilder sb=new StringBuilder("左岸为:");
  108.                 if(lift.size()>0){
  109.                         for(String s : lift){
  110.                                 sb.append(s.charAt(0));
  111.                         }
  112.                 }else{
  113.                         sb.append("空");
  114.                 }
  115.                 sb.append(";右岸为:");
  116.                 if(right.size()>0){
  117.                         for(String s : right){
  118.                                 sb.append(s.charAt(0));
  119.                         }
  120.                 }else{
  121.                         sb.append("空");
  122.                 }
  123.                
  124.                 System.out.println(sb.toString());
  125.                 System.out.println();
  126.         }
  127.        

  128. }
复制代码
回复 使用道具 举报
今天写了半天
  1. package com.itheima;

  2. import java.util.ArrayList;


  3. public class River3 {
  4.        
  5.        
  6.         //此变量用来标示正确的步数,
  7.         public static int count=1;
  8.         /**
  9.          * @param args
  10.          *
  11.          * 思路:
  12.          *
  13.          * 1,狗用“狗猫”代替,猫用”猫鱼“代替,鱼用“鱼儿”代替,首字符代表自己,
  14.          * 尾字符代表其食物;方便互斥判断
  15.          * 2,new两个ArrayList<string>:Left和Right,分别代表河左岸,右岸;
  16.          *,3,Left中存储三个动物,都移到Right集合则完成任务;
  17.          * 4,
  18.          */
  19.         public static void main(String[] args) {
  20.                 // TODO Auto-generated method stub
  21.                 String[] arr={"狗","猫","鱼"};
  22.                
  23.                
  24.                 //字符替换动作,方便做互斥判断,
  25.                 for(int i=0;i<arr.length;i++){
  26.                         if(arr[i].equals("狗"))
  27.                                 arr[i]="狗猫";
  28.                         else{
  29.                                 if(arr[i].equals("猫"))
  30.                                         arr[i]="猫鱼";
  31.                                 else{
  32.                                         if(arr[i].equals("鱼"))
  33.                                                 arr[i]="鱼儿";
  34.                                 }
  35.                         }
  36.                 }

  37.                
  38.                 ArrayList<String> lift=new        ArrayList<String>();
  39.                 ArrayList<String> right=new ArrayList<String>();
  40.        
  41.        
  42.                 //各动物到达左岸;
  43.                 for(String s : arr){
  44.                         lift.add(s);
  45.                 }
  46.                 System.out.println("各动物到达左岸,准备渡河:");
  47.                 show(lift,right);
  48.                 System.out.println();
  49.                
  50.                
  51.                
  52.                 //开始渡河,若右岸集合有三个元素,任务完成程序结束
  53.                 while(right.size()!=3){
  54.                         String animal=lift.remove(0);
  55.                        
  56.                         //左岸移出,右岸添入;
  57.                         right.add(animal);
  58.                        
  59.                        
  60.                        
  61.                         //调用test()方法,测试两集合的互斥情况,返回布尔值进行处理;
  62.                         //发生互斥,右岸移回一个动物,否则不做任何动作,程序继续;
  63.                        
  64.                         if(!test(lift)){
  65.                                 animal=right.remove(0);
  66.                                 lift.add(animal);                               
  67.                         }else{
  68.                                 System.out.println(animal.charAt(0)+"送到右岸!");
  69.                                 show(lift,right);
  70.                         }
  71.                                
  72.                         if(!test(right)){
  73.                                 System.out.println(right.get(0).charAt(0)+"送回左岸!");
  74.                                 animal=right.remove(0);
  75.                                 lift.add(animal);
  76.                                 show(lift,right);
  77.                         }
  78.                        
  79.                 }
  80.                 System.out.println("所有动物来到了右岸!!");
  81.         }
  82.        
  83.        
  84.         //两集合进行互斥处理;
  85.         public static boolean test(ArrayList<String> list){
  86.                 boolean b=true;
  87.                 if(list.size()==3)
  88.                         return b;
  89.                 String s1="";
  90.                 String s2="";
  91.                 if(list.size()==2){
  92.                         s1=list.get(0);
  93.                         s2=list.get(1);
  94.                        
  95.                                 if(s1.contains(s2.charAt(1)+"")){
  96.                                         b=false;
  97.                                 }
  98.                                 if(s2.contains(s1.charAt(1)+"")){
  99.                                         b=false;
  100.                                 }
  101.                 }
  102.                 return b;
  103.         }
  104.        
  105.        
  106.         public static void show(ArrayList<String> lift,ArrayList<String> right){
  107.                 StringBuilder sb=new StringBuilder("左岸为:");
  108.                 if(lift.size()>0){
  109.                         for(String s : lift){
  110.                                 sb.append(s.charAt(0));
  111.                         }
  112.                 }else{
  113.                         sb.append("空");
  114.                 }
  115.                 sb.append(";右岸为:");
  116.                 if(right.size()>0){
  117.                         for(String s : right){
  118.                                 sb.append(s.charAt(0));
  119.                         }
  120.                 }else{
  121.                         sb.append("空");
  122.                 }
  123.                
  124.                 System.out.println(sb.toString());
  125.                 System.out.println();
  126.         }
  127.        

  128. }
复制代码
才写出来这题;
回复 使用道具 举报
这题我也做了,代码太复杂了,你们的简单多了,受教了
回复 使用道具 举报
这是基础测试还是入学考试的题?
回复 使用道具 举报
这道题在我基础测试的时候也做过,
但是我只有9.5分
我贴上代码给你参考一下吧,
  1. package com.itheima;

  2. public class Test10 {

  3.         /**
  4.          * 一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
  5.          * 当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。 编程解决猫狗鱼过河问题
  6.          */
  7.         public static void main(String[] args) {

  8.                 // 猫狗鱼的数组
  9.                 String[] animal = { "猫", "狗", "鱼" };

  10.                 // 循环出所有过河的可能
  11.                 for (int i = 0; i < animal.length; i++) {

  12.                         for (int j = 0; j < animal.length; j++) {

  13.                                 for (int k = 0; k < animal.length; k++) {

  14.                                         // 排除掉 猫猫猫 狗狗狗等组合...
  15.                                         if (i != j && i != k && k != j) {
  16.                                                 System.out.print("组合方式:" + animal[i] + "," + animal[j]
  17.                                                                 + "," + animal[k]);

  18.                                                 // 因为食物级别,作为中间的猫必须先带走,排除掉先带走狗和鱼的可能
  19.                                                 if (animal[i] == "狗") {
  20.                                                         System.out.println("\t猫吃掉了鱼");
  21.                                                 } else if (animal[i] == "鱼") {
  22.                                                         System.out.println("\t狗吃掉了猫");
  23.                                                 } else {
  24.                                                         System.out.println("\t渡河成功");
  25.                                                 }
  26.                                         }

  27.                                 }

  28.                         }

  29.                 }

  30.         }

  31. }
复制代码



回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马