當柳上原的風吹向天際的時候...

          真正的快樂來源于創造

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks
          原題如下:用1、2、2、3、4、5這六個數字,用java寫一個程序,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"與"5"不能相連。

          一.全排列解法:

          package com.heyang.p122345;

          import java.util.HashSet;
          import java.util.Set;

          /**
           * 用1、2、2、3、4、5這六個數字,用java寫一個程序,打印出所有不同的排列,如:512234、412345等,
           * 要求:"4"不能在第三位,"3"與"5"不能相連。
           * 說明: 以下為全排列做法
           * 作者:heyang(heyang78@gmail.com)
           * 創建時間:2010-6-22 上午12:46:37
           * 修改時間:2010-6-22 上午12:46:37
           
          */
          public class Permutation{
              
          // 用于序號
              private static int  index=1;
              
              
          // 用于清除重復的數,因為有兩個2的影響
              private static Set<String> set=new HashSet<String>();
              
              
          public static void main(String[] args){
                  Integer[] arr02
          ={1,2,2,3,4,5};
                  
          //Integer[] arr02={1,2,2};
                  permutation(arr02,0,arr02.length);
              }
              
              
          /**
               * 排列函數
               * 
               * 說明:
               * 
          @param arr
               * 
          @param start
               * 
          @param end
               * 創建時間:2010-6-22 上午02:05:12
               * 修改時間:2010-6-22 上午02:05:12
               
          */
              
          public static void permutation(Integer[] arr,int start,int end){
                  
          if(start<end+1){
                      permutation(arr,start
          +1,end);
                      
                      
          for(int i=start+1;i<end;i++){
                          Integer temp;
                          
                          temp
          =arr[start];
                          arr[start]
          =arr[i];
                          arr[i]
          =temp;
                          
                          permutation(arr,start
          +1,end);
                          
                          temp
          =arr[i];
                          arr[i]
          =arr[start];
                          arr[start]
          =temp;
                      }
                  }
                  
          else{
                      print(arr);
                  }
              }

              
          /**
               * 打印函數
               * 
               * 說明:
               * 
          @param arr
               * 創建時間:2010-6-22 上午02:05:27
               * 修改時間:2010-6-22 上午02:05:27
               
          */
              
          private static void print(Integer[] arr){
                  
          // "4"不能在第三位
                  if(arr[2]==4){
                      
          return;
                  }
                  
                  StringBuilder sb
          =new StringBuilder();
                  
                  
          for(int i=0;i<arr.length;i++){
                      sb.append(arr[i]);
                  }
                  
                  String word
          =sb.toString();
                  
                  
          // "3"與"5"不能相連
                  if(word.contains("35"|| word.contains("53")){
                      
          return;
                  }
                  
                  
          // 打印
                  if(set.contains(word)==false){
                      System.out.println((index
          ++)+" "+word);
                      set.add(word);
                  }
              }
          }
          輸出:
          1 122345
          2 122543
          3 123245
          4 123254
          5 123425
          6 123452
          7 125432
          8 125423
          9 125243
          10 125234
          11 132245
          12 132254
          13 132425
          14 132452
          15 132542
          16 132524
          17 142325
          18 142523
          19 143225
          20 143252
          21 145232
          22 145223
          23 152342
          24 152324
          25 152432
          26 152423
          27 152243
          28 152234
          29 212345
          30 212543
          31 213245
          32 213254
          33 213425
          34 213452
          35 215432
          36 215423
          37 215243
          38 215234
          39 221345
          40 221543
          41 223145
          42 223154
          43 223415
          44 223451
          45 225431
          46 225413
          47 225143
          48 225134
          49 232145
          50 232154
          51 232415
          52 232451
          53 232541
          54 232514
          55 231245
          56 231254
          57 231425
          58 231452
          59 231542
          60 231524
          61 242315
          62 242513
          63 243215
          64 243251
          65 243125
          66 243152
          67 241325
          68 241523
          69 245132
          70 245123
          71 245213
          72 245231
          73 252341
          74 252314
          75 252431
          76 252413
          77 252143
          78 252134
          79 251342
          80 251324
          81 251432
          82 251423
          83 251243
          84 251234
          85 322145
          86 322154
          87 322415
          88 322451
          89 322541
          90 322514
          91 321245
          92 321254
          93 321425
          94 321452
          95 321542
          96 321524
          97 325142
          98 325124
          99 325412
          100 325421
          101 325241
          102 325214
          103 312245
          104 312254
          105 312425
          106 312452
          107 312542
          108 312524
          109 315242
          110 315224
          111 315422
          112 342125
          113 342152
          114 342215
          115 342251
          116 342521
          117 342512
          118 341225
          119 341252
          120 341522
          121 345122
          122 345212
          123 345221
          124 422315
          125 422513
          126 423215
          127 423251
          128 423125
          129 423152
          130 421325
          131 421523
          132 425132
          133 425123
          134 425213
          135 425231
          136 432215
          137 432251
          138 432125
          139 432152
          140 432512
          141 432521
          142 431225
          143 431252
          144 431522
          145 412325
          146 412523
          147 413225
          148 413252
          149 415232
          150 415223
          151 452312
          152 452321
          153 452132
          154 452123
          155 452213
          156 452231
          157 451322
          158 451232
          159 451223
          160 522341
          161 522314
          162 522431
          163 522413
          164 522143
          165 522134
          166 523241
          167 523214
          168 523421
          169 523412
          170 523142
          171 523124
          172 521342
          173 521324
          174 521432
          175 521423
          176 521243
          177 521234
          178 542321
          179 542312
          180 542231
          181 542213
          182 542123
          183 542132
          184 543221
          185 543212
          186 543122
          187 541322
          188 541232
          189 541223
          190 512342
          191 512324
          192 512432
          193 512423
          194 512243
          195 512234
          196 513242
          197 513224
          198 513422


          二.循環解法:
          package com.heyang.p122345;


          /**
           * 用1、2、2、3、4、5這六個數字,用java寫一個程序,打印出所有不同的排列,如:512234、412345等,
           * 要求:"4"不能在第三位,"3"與"5"不能相連。
           * 說明: 以下為循環做法
           * 作者:heyang(heyang78@gmail.com)
           * 創建時間:2010-6-22 上午12:46:37
           * 修改時間:2010-6-22 上午12:46:37
           
          */
          public class Loop{
              
          // 用于序號
              private static int  index=1;
              
              
          public static void main(String[] args){
                  
          // 這個數組用來放置百萬,十萬,萬,千,百,十,個位數字
                  int[] arr=new int[6];
                  
                  
          // 這個用來存儲數字轉化成的字符串
                  String word;
                  
                  
          int j;
                  
          // i在能排列出來的最大值和最小值之間循環
                  for(int i=122345;i<=543221;i++){
                      
          // 得到百萬,十萬,萬,千,百,十,個位數字
                      for(j=0;j<arr.length;j++){
                          arr[j]
          =(i/(power(6-j))) % 10;
                      }
                      
                      
          // 0,6-9都被排除
                      if(hasExtraNumber(arr)==true){
                          
          continue;
                      }
                      
                      
          // "4"不能在第三位
                      if(arr[2]==4){
                          
          continue;
                      }
                      
                      word
          =String.valueOf(i);
                      
                      
          // "3"與"5"不能相連
                      if(word.contains("35"|| word.contains("53")){
                          
          continue;
                      }
                      
                      
          // 只有2可以連兩次
                      if(judge(arr)==false){
                          
          continue;
                      }
                      
                      
          // 打印
                      System.out.println((index++)+" "+word);
                      
          //System.out.println(i+"  "+arr[0]+arr[1]+arr[2]+arr[3]+arr[4]+arr[5]);
                  }
              }
              
              
          private static boolean judge(int[] arr){
                  
          int n1=0,n2=0,n3=0,n4=0,n5=0;
                  
                  
          for(int j=0;j<arr.length;j++){
                      
          if(arr[j]==1){
                          n1
          ++;
                      }
                      
                      
          if(arr[j]==2){
                          n2
          ++;
                      }
                      
                      
          if(arr[j]==3){
                          n3
          ++;
                      }
                      
                      
          if(arr[j]==4){
                          n4
          ++;
                      }
                      
                      
          if(arr[j]==5){
                          n5
          ++;
                      }
                  }
                  
                  
          return n1==1 && n2==2 && n3==1 && n4==1 && n5==1;
              }
              
              
          /**
               * 看是否有不在1-5范圍內的數字
               * 
               * 說明:
               * 
          @param arr
               * 
          @return
               * 創建時間:2010-6-22 上午01:20:50
               * 修改時間:2010-6-22 上午01:20:50
               
          */
              
          private static boolean hasExtraNumber(int[] arr){
                  
          for(int j=0;j<arr.length;j++){
                      
          if(arr[j]<1 || arr[j]>5){
                          
          return true;
                      }
                  }
                  
                  
          return false;
              }
              
              
          /**
               * 取10的n-1次方
               * 
               * 說明:
               * 
          @param n
               * 
          @return
               * 創建時間:2010-6-22 上午01:16:35
               * 修改時間:2010-6-22 上午01:16:35
               
          */
              
          private static int power(int n){
                  
          int retval=1;
                  
                  
          for(int i=0;i<n-1;i++){
                      retval
          *=10;
                  }
                  
                  
          return retval;
              }
          }
          輸出:
          1 122345
          2 122543
          3 123245
          4 123254
          5 123425
          6 123452
          7 125234
          8 125243
          9 125423
          10 125432
          11 132245
          12 132254
          13 132425
          14 132452
          15 132524
          16 132542
          17 142325
          18 142523
          19 143225
          20 143252
          21 145223
          22 145232
          23 152234
          24 152243
          25 152324
          26 152342
          27 152423
          28 152432
          29 212345
          30 212543
          31 213245
          32 213254
          33 213425
          34 213452
          35 215234
          36 215243
          37 215423
          38 215432
          39 221345
          40 221543
          41 223145
          42 223154
          43 223415
          44 223451
          45 225134
          46 225143
          47 225413
          48 225431
          49 231245
          50 231254
          51 231425
          52 231452
          53 231524
          54 231542
          55 232145
          56 232154
          57 232415
          58 232451
          59 232514
          60 232541
          61 241325
          62 241523
          63 242315
          64 242513
          65 243125
          66 243152
          67 243215
          68 243251
          69 245123
          70 245132
          71 245213
          72 245231
          73 251234
          74 251243
          75 251324
          76 251342
          77 251423
          78 251432
          79 252134
          80 252143
          81 252314
          82 252341
          83 252413
          84 252431
          85 312245
          86 312254
          87 312425
          88 312452
          89 312524
          90 312542
          91 315224
          92 315242
          93 315422
          94 321245
          95 321254
          96 321425
          97 321452
          98 321524
          99 321542
          100 322145
          101 322154
          102 322415
          103 322451
          104 322514
          105 322541
          106 325124
          107 325142
          108 325214
          109 325241
          110 325412
          111 325421
          112 341225
          113 341252
          114 341522
          115 342125
          116 342152
          117 342215
          118 342251
          119 342512
          120 342521
          121 345122
          122 345212
          123 345221
          124 412325
          125 412523
          126 413225
          127 413252
          128 415223
          129 415232
          130 421325
          131 421523
          132 422315
          133 422513
          134 423125
          135 423152
          136 423215
          137 423251
          138 425123
          139 425132
          140 425213
          141 425231
          142 431225
          143 431252
          144 431522
          145 432125
          146 432152
          147 432215
          148 432251
          149 432512
          150 432521
          151 451223
          152 451232
          153 451322
          154 452123
          155 452132
          156 452213
          157 452231
          158 452312
          159 452321
          160 512234
          161 512243
          162 512324
          163 512342
          164 512423
          165 512432
          166 513224
          167 513242
          168 513422
          169 521234
          170 521243
          171 521324
          172 521342
          173 521423
          174 521432
          175 522134
          176 522143
          177 522314
          178 522341
          179 522413
          180 522431
          181 523124
          182 523142
          183 523214
          184 523241
          185 523412
          186 523421
          187 541223
          188 541232
          189 541322
          190 542123
          191 542132
          192 542213
          193 542231
          194 542312
          195 542321
          196 543122
          197 543212
          198 543221



          posted on 2010-06-22 02:20 何楊 閱讀(2175) 評論(2)  編輯  收藏

          Feedback

          # re: 一道筆試題(122345求有條件全排列)的兩種做法 2010-07-01 10:41 杜杜
          老師,能把第一種方法的思路給講一講嗎?那個函數有點看不明白  回復  更多評論
            

          # re: 一道筆試題(122345求有條件全排列)的兩種做法 2010-07-02 18:42 何楊
          @杜杜

          初看上去全排列函數確實不好明白,你把兩個數的全排列和三個數的按照這段程序在紙上重現一遍就清楚了。  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 丹寨县| 建水县| 广丰县| 容城县| 延寿县| 盈江县| 平南县| 甘泉县| 象山县| 景德镇市| 张北县| 新乡市| 拉萨市| 旺苍县| 蒙阴县| 若尔盖县| 镇雄县| 遵义市| 丹巴县| 招远市| 淮南市| 静海县| 青海省| 华宁县| 栖霞市| 澄城县| 罗平县| 赣榆县| 宜兰县| 巴塘县| 通化县| 淮滨县| 且末县| 丰城市| 巍山| 新邵县| 永善县| 新晃| 大石桥市| 昭平县| 千阳县|