春風博客

          春天里,百花香...

          導航

          <2008年4月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          統(tǒng)計

          公告

          MAIL: junglesong@gmail.com
          MSN: junglesong_5@hotmail.com

          Locations of visitors to this page

          常用鏈接

          留言簿(11)

          隨筆分類(224)

          隨筆檔案(126)

          個人軟件下載

          我的其它博客

          我的鄰居們

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          使用全排列方法解九宮格問題

          下面的方法能解出九宮格,但對于更高階只有理論可能性,因為耗時太長,不能作為通用解決方案。

          輸出:
          2    7    6    
          9    5    1    
          4    3    8   


          package com.sitinspring;

          public class SquarePuzzle{
              
          /**
               * 階數(shù)
               
          */
              
          private int n;
              
              
          /**
               * 方陣數(shù)組
               
          */
              
          private Integer[] arr;
              
              
          /**
               * 平均值
               
          */
              
          private int average;
              
              
          public SquarePuzzle(int n){
                  
          this.n=n;
                  
                  
          // 建立數(shù)組并得到平均值
                  arr=new Integer[n*n];
                  
                  average
          =0;
                  
          for(int i=1;i<=n*n;i++){
                      arr[i
          -1]=i;
                      average
          +=i;
                  }
                  average
          =average/n;
                  
                  
          // 遞歸查看
                  permutation(arr,0,arr.length);
              }
              
              
          private 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{
                      
          /*for(int i=0;i<end;i++){
                          System.out.print(arr[i]);
                      }
                      System.out.print("\n");
          */
                      
                      
          int i,sum=0;
                      
                      
          for(i=0;i<n;i++){
                          sum
          +=arr[i];
                      }
                      
                      
          if(sum!=average){
                          
          return;
                      }
                      
                      
          // 查看是否縱橫對角線值都相等
                      checkAndPrint(arr);
                  }
              }
              
              
          private void checkAndPrint(Integer[] arr){
                  Integer[][] arr2
          =new Integer[n][n];
                  
          int i,j,sum;
                  
                  
          for(i=0;i<n;i++){
                      
          for(j=0;j<n;j++){
                          arr2[i][j]
          =arr[i*n+j];
                      }
                  }
                  
                  
          // 橫
                  for(i=0;i<n;i++){
                      sum
          =0;
                      
          for(j=0;j<n;j++){
                          sum
          +=arr2[i][j];
                      }
                      
                      
          if(sum!=average){
                          
          return;
                      }
                  }
                  
                  
          // 縱
                  for(i=0;i<n;i++){
                      sum
          =0;
                      
          for(j=0;j<n;j++){
                          sum
          +=arr2[j][i];
                      }
                      
                      
          if(sum!=average){
                          
          return;
                      }
                  }
                  
                  
          // 對角線
                  sum=0;
                  
          for(i=0;i<n;i++){
                      sum
          +=arr2[i][i];        
                  }
                  
                  
          if(sum!=average){
                      
          return;
                  }
                  
                  
          // 對角線
                  sum=0;
                  
          for(i=0;i<n;i++){
                      sum
          +=arr2[i][n-i-1];        
                  }
                  
                  
          if(sum!=average){
                      
          return;
                  }
                  
                  
          // 最終打印
                  for(i=0;i<n;i++){
                      
          for(j=0;j<n;j++){
                          System.out.print(arr2[i][j]
          +"\t");;
                      }
                      
                      System.out.print(
          "\n");;
                  }
                  System.out.print(
          "\n");;
                  System.exit(
          0);
              }
              
              
          public static void main(String[] args){
                  
          new SquarePuzzle(3);
              }
          }

          posted on 2008-04-08 22:16 sitinspring 閱讀(2096) 評論(1)  編輯  收藏 所屬分類: 算法數(shù)據(jù)結(jié)構(gòu)

          評論

          # re: 使用全排列方法解九宮格問題 2008-11-19 19:27 楊鞠孝

          好   回復  更多評論   

          sitinspring(http://www.aygfsteel.com)原創(chuàng),轉(zhuǎn)載請注明出處.
          主站蜘蛛池模板: 玉树县| 临夏县| 凤阳县| 肃南| 霍林郭勒市| 北碚区| 元氏县| 鹰潭市| 麻栗坡县| 额济纳旗| 汕头市| 巴彦淖尔市| 沁阳市| 互助| 庆城县| 肇东市| 崇州市| 闽清县| 从化市| 闸北区| 治多县| 万荣县| 永年县| 辉南县| 杨浦区| 镇宁| 伊宁市| 花垣县| 建宁县| 平山县| 米林县| 巫山县| 密云县| 灌阳县| 平邑县| 东乡族自治县| 霍山县| 南京市| 婺源县| 聊城市| 奉化市|