传教士 野人过河

    最近偶尔看到某公司的一道算法招聘题,有网友给出了思路和实现,我看了一下,分析和实现的都很不错,对于学习算法的人非常有好处;原帖子请看:http://blog.csdn.net/huangxy10/article/details/8066408,原帖子作者思路清晰,并给出了C语言的实现,我在此翻译成java语言,供大家参考,先简单把题目给大家贴一下:

1、题目如下:

传教士人数M,野人C,M≥C,开始都在岸左边,

①船只能载两人,传教士和野人都会划船,当然必须有人划船;
②两岸边保证野人人数不能大于传教士人数;
把所有人都送过河,设计一方案,要求编程实现。 

2、java代码如下:

  
  
  
  
  1. import java.util.Stack; 
  2.  
  3. public class Guohe { 
  4.  
  5.   static boolean  flag = true
  6.   static Stack<String> visit = new Stack<String>(); 
  7.  
  8.   private static boolean dfs(int M, int C, int m, int c) { 
  9.  
  10.     if (M < 0 || C < 0 || m < 0 || c < 0) // 非法 
  11.       return false; 
  12.     if ((M > 0 && C > M) || (m > 0 && c > m)) // 野人会吃牧师 
  13.       return false; 
  14.     if (flag && M == 0 && C == 0 || (!flag && m == 0 && c == 0)) // 全部运输过去 
  15.       return true; 
  16.     String str = ""
  17.     if (!flag) { 
  18.       str = "M=" + M + ",C=" + C + ",m=" + m + ",c=" + c + ",boat=left"; 
  19.     } else { 
  20.       str = "M=" + m + ",C=" + c + ",m=" + M + ",c=" + C + ",boat=right"; 
  21.     } 
  22.     if (visit.contains(str)) { // 该状态已经搜索过了 
  23.       return false; 
  24.     } 
  25.      
  26.     visit.push(str); 
  27.     flag = !flag; 
  28.     if(dfs( m+2, c, M-2,C) ){   
  29.       System.out.println("1--" + str); 
  30.         return true;   
  31.     }   
  32.     else if( dfs( m, c+2, M, C-2) ){ 
  33.       System.out.println("2--" + str); 
  34.         return true;   
  35.     }   
  36.     else if( dfs( m+1, c+1, M-1, C-1) ){ 
  37.       System.out.println("3--" + str); 
  38.         return true;   
  39.     }   
  40.     else if( dfs( m+1, c, M-1, C)){ 
  41.       System.out.println("4--" + str); 
  42.         return true;   
  43.     }   
  44.     else if( dfs( m, c+1, M, C-1)){ 
  45.       System.out.println("5--" + str); 
  46.         return true;   
  47.     }   
  48.     flag = !flag; 
  49.     visit.pop(); 
  50.     return false; 
  51.   } 
  52.   public static void main(String []args) { 
  53.     int M = 6
  54.     int C = 5
  55.     int m = 0
  56.     int c = 0
  57.     String str = "M=" + M + ",C=" + C + ",m=" + m + ",c=" + c + ",boat=left"; 
  58.     visit.push(str); 
  59.     System.out.println(str); 
  60.     if (!dfs(M, C, m, c)) { 
  61.       System.out.println("Can not find the solution"); 
  62.     } 
  63.   } 

 

 

 

你可能感兴趣的:(java语言,过河,传教士)