春風博客

          春天里,百花香...

          導航

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

          統計

          公告

          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{
              
          /**
               * 階數
               
          */
              
          private int n;
              
              
          /**
               * 方陣數組
               
          */
              
          private Integer[] arr;
              
              
          /**
               * 平均值
               
          */
              
          private int average;
              
              
          public SquarePuzzle(int n){
                  
          this.n=n;
                  
                  
          // 建立數組并得到平均值
                  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)  編輯  收藏 所屬分類: 算法數據結構

          評論

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

          好   回復  更多評論   

          sitinspring(http://www.aygfsteel.com)原創,轉載請注明出處.
          主站蜘蛛池模板: 施秉县| 巩义市| 阳西县| 沐川县| 晋中市| 琼中| 小金县| 尖扎县| 霍邱县| 临安市| 夹江县| 山东省| 额敏县| 盐亭县| 凤翔县| 舒兰市| 潢川县| 左贡县| 讷河市| 崇仁县| 怀集县| 青铜峡市| 秦安县| 南涧| 隆安县| 城口县| 安岳县| 富阳市| 辛集市| 西城区| 翼城县| 木兰县| 赤峰市| 彭山县| 汽车| 广汉市| 和静县| 库车县| 林口县| 丰台区| 筠连县|