1,2,3,4,5,6共6个数, 组成一个没有重复数字的六位数,4不能在第二位,2和3不能邻接,请列出所有可能的组合.自己也思考了这个问题,可是觉得自己写出的算法虽然结果应该是正确的,可是觉得算法过于复杂.我的算法可以在附件上下载,仅供参考.这里,想向大家请教较优的解法,还望各位高手多多请教,写出自己的算法,如果能写出源码就更好了!(大家可别告诉我用六个for循环来解决这个问题)

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【zhuxianfeng】截止到2008-06-27 09:02:00的历史汇总数据(不包括此帖):
    发帖数:19                 发帖分:315                
    结贴数:4                  结贴分:80                 
    未结数:15                 未结分:235                
    结贴率:21.05 %            结分率:25.40 %            
    楼主该结一些帖子了
      

  2.   


    import java.util.ArrayList;   
      
    import java.util.List;   
    import java.util.Set;   
    import java.util.TreeSet;   
    /**  
     *   
     * @author 赵学庆 www.java2000.net  
     *  
     */  
    public class T {   
      public static List<String> find(List<String> list) {   
        List<String> rtn = new ArrayList<String>();   
        String str;   
        for (int i = 0; i < list.size(); i++) {   
          str = list.get(i);   
          list.remove(i);   
          if (list.size() == 0) {   
            rtn.add(str);   
          } else {   
            List<String> sList = find(list);   
            for (String s : sList) {   
              rtn.add(str + s);   
              if (s.length() == 5) {   
                addNumber(str + s);   
              }   
            }   
          }   
          list.add(i, str);   
        }   
        return rtn;   
      }   
      
      public static void addNumber(String str) {   
        if (str.charAt(2) == '4' || str.contains("35") || str.contains("53")) {   
          return;   
        }   
        set.add(str);   
      }   
      
      public static Set<String> set = new TreeSet<String>();   
      
      public static void main(String[] args) {   
        List<String> list = new ArrayList<String>();   
        list.add("1");   
        list.add("2");   
        list.add("2");   
        list.add("3");   
        list.add("4");   
        list.add("5");   
        find(list);   
        System.out.println(set.size());   
        int cols = 10;   
        for (String s : set) {   
          System.out.print(s+" ");   
          if(cols--==1) {   
            System.out.println();   
            cols = 10;   
          }   
        }   
      }   
    }  
      

  3.   


    import java.util.Set;   
    import java.util.TreeSet   
    /**  
     * 原始版本没有考虑重复问题,我进行了修正.<br>  
     * 此算法的精华就是,让一个字符串的所有位置都进行互换,<br>  
     * 这样就产生了所有可能出现的字符串。  
     *   
     * @author 赵学庆,nicky_zs <A href="http://www.java2000.net">www.java2000.net</A>  
     */  
    public class MyTest {   
      public static void main(String args[]) {   
        char[] number = new char[] { '1', '2', '2', '3', '4', '5' };   
        perm(number, 0, number.length - 1);   
        System.out.println(set.size());   
        int cols = 10;   
        for (String s : set) {   
          System.out.print(s + " ");   
          if (cols-- == 1) {   
            System.out.println();   
            cols = 10;   
          }   
        }   
      }   
      public static void addNumber(String str) {   
        set.add(str);   
      }   
      public static Set<String> set = new TreeSet<String>();   
      public static void perm(char[] n, int beg, int end) {   
        if (beg == end) {   
          String result = String.valueOf(n);   
          if (n[2] == '4')   
            return;   
          if (result.contains("35") || result.contains("53"))   
            return;   
          addNumber(String.valueOf(n));   
          return;   
        }   
        for (int i = beg; i <= end; ++i) {   
          swap(n, beg, i);   
          perm(n, beg + 1, end);   
          swap(n, beg, i);   
        }   
      }   
      public static int number = 0;   
      public static void swap(char[] n, int a, int b) {   
        char temp = n[a];   
        n[a] = n[b];   
        n[b] = temp;   
      }   
    }  
      

  4.   

    你研究一下竹子的.我是没搞明白.
    http://www.java2000.net/viewthread.jsp?tid=6323