littlefermat

          生成任意階的幻方

          算法參考http://baike.baidu.com/view/325330.htm

          1.首先用horse法生成奇階幻方

          /**
           * horse法生成奇階幻方
           * 
          @author wangliang
           *
           
          */

          public class Hf2n_1 {
              
          public static void main(String args[]){
                  
          int number=5;
                  
          int matrix[][]=createnumber(number);
                  
          for(int i=0;i<number;i++){
                      
          for(int j=0;j<number;j++){
                          System.out.print(matrix[i][j]
          +"   ");
                      }

                      System.out.println();
                  }

              }

              
              
          public static int[][] createnumber(int n){
                  
          int magicmatrix[][]=new int[n][n];
                  
          int i=0;
                  
          int j=n/2;
                  
          for(int m=1;m<=n*n;m++){
                      magicmatrix[i][j]
          =m;
                      
          int p=(i-1+n)%n;
                      
          int q=(j+1+n)%n;
                      
          if(magicmatrix[p][q]==0){
                          i
          =p;
                          j
          =q;
                      }

                      
          else i=(i+1)%n;
                  }

                  
          return magicmatrix;   
              }

          }
          2.Strachey法生產(chǎn)4m+2階的幻方
          /**
           * Strachey法生產(chǎn)4m+2階的幻方
           * 
          @author wangliang
           *
           
          */

          public class Hf4m_2 {
              
          public static void main(String args[]){
                  
          int number=10;
                  
          int matrix[][]=createnumber(number);
                  
          for(int i=0;i<number;i++){
                      
          for(int j=0;j<number;j++){
                          System.out.print(matrix[i][j]
          +"   ");
                      }

                      System.out.println();
                  }

                  
              }

              
              
          public static int[][] createnumber(int n){
                  
          int a[][]=new int[n][n];
                  
          int temp=n/2;
                  
          int temp2=(n-2)/4;
                  
          int b[][]=Hf2n_1.createnumber(temp);
                  
          for(int i=0;i<n;i++){
                      
          for(int j=0;j<n;j++){
                          
          if(i<temp&&j<temp){
                              a[i][j]
          =b[i][j];
                          }

                          
          else if(i>=temp&&j>=temp){
                              a[i][j]
          =b[i%temp][j%temp]+temp*temp;
                          }

                          
          else if(i<temp&&j>=temp){
                              a[i][j]
          =b[i%temp][j%temp]+2*temp*temp;
                          }

                          
          else{
                              a[i][j]
          =b[i%temp][j%temp]+3*temp*temp;
                          }

                      }

                  }

                  
                  
          for(int i=0;i<temp;i++){
                      
          if(i!=temp2){
                          
          for(int j=0;j<temp2;j++){
                              
          int tem=a[i][j];
                              a[i][j]
          =a[i+temp][j];
                              a[i
          +temp][j]=tem;
                          }

                      }

                      
          if(i==temp2){
                          
          for(int j=1;j<temp2+1;j++){
                              
          int tem=a[i][j];
                              a[i][j]
          =a[i+temp][j];
                              a[i
          +temp][j]=tem;
                          }

                      }

                      
          for(int j=n-1;j>=n-(temp2-1);j--){
                          
          int tem=a[i][j];
                          a[i][j]
          =a[i+temp][j];
                          a[i
          +temp][j]=tem;
                      }

                      
                  }

                  
          return a;
              }

          }


          3.Spring法生產(chǎn)4m階幻方
          /**
           * Spring法生產(chǎn)4m階幻方
           * 
          @author wangliang
           *
           
          */

          public class Hf4m {
              
          public static void main(String args[]){
                  
          int number=4;
                  
          int matrix[][]=createnumber(number);
                  
          for(int i=0;i<number;i++){
                      
          for(int j=0;j<number;j++){
                          System.out.print(matrix[i][j]
          +"   ");
                      }

                      System.out.println();
                  }

                  
              }

              
              
          public static int[][] createnumber(int n){
                  
          int a[][]=new int[n][n];
                  
          for(int i=0;i<n*n;i++){
                      
          int p=i/n;
                      
          int q=i%n;
                      a[p][q]
          =i+1;
                  }

                  
                  
                  
          for(int i=0;i<n;i++){
                      
          for(int j=0;j<i;j++){
                          
          if((i+j)%4!=3&&(i-j)%4!=0){
                              
          int t1=a[i][j];
                              a[i][j]
          =a[n-1-i][n-1-j];
                              a[n
          -1-i][n-1-j]=t1;
                          }

                      }

                  }

                  
          return a;
              }

              
          }


          4.生成用戶界面
          import java.awt.Container;
          import java.awt.event.ActionEvent;
          import java.awt.event.ActionListener;
          import javax.swing.*;
          import java.awt.*;


          public class MagicMatrix extends JFrame implements ActionListener{
              
          private JPanel center;
              
          private JPanel right;
              
          private JLabel label;
              
          private JSpinner level;
              
          private JButton Louberel;
              
          public MagicMatrix(){
                  center
          =createpanel(3);
                  add(center,BorderLayout.CENTER);
                  right
          =new JPanel();
                  label
          =new JLabel("選擇矩陣階數(shù)");
                  level
          =new JSpinner(new SpinnerNumberModel(3,3,100,1));
                  Louberel
          =new JButton("生成");
                  Louberel.addActionListener(
          this);
                  right.add(label,BorderLayout.WEST);
                  right.add(level,BorderLayout.CENTER);
                  right.add(Louberel,BorderLayout.EAST);
                  add(right,BorderLayout.NORTH);
                  setTitle(
          "magic matrix(www.aygfsteel.com/littlefermat)");
                  setSize(
          340,296);
                  setVisible(
          true);
              }

              
              
          public void actionPerformed(ActionEvent e){
                  
          if(e.getSource()==Louberel){
                      
          int levelnumber=((Integer)level.getValue()).intValue();
                      center
          =createpanel(levelnumber);
                      add(center,BorderLayout.CENTER);
                      validate();
                  }

              }

              
              
          /**生成相應的面板*/
              
          private JPanel createpanel(int n){
                  
          int matrix[][];//生產(chǎn)的矩陣
                  int matrixshow[][]=new int[n+1][n+1];//現(xiàn)實的矩陣,包括每行,每列和對角線的和
                  if(n%2==1){
                      matrix
          =Hf2n_1.createnumber(n);
                  }

                  
          else if(n%4==0){
                      matrix
          =Hf4m.createnumber(n);
                  }

                  
          else {
                      matrix
          =Hf4m_2.createnumber(n);
                  }

                  
          for(int i=0;i<n;i++){
                      
          for(int j=0;j<n;j++){
                          matrixshow[i][j]
          =matrix[i][j];
                      }

                  }

                  
          for(int i=0;i<n;i++){
                      
          for(int j=0;j<n;j++){
                          matrixshow[i][n]
          +=matrix[i][j];
                      }

                  }

                  
                  
          for(int i=0;i<n;i++){
                      
          for(int j=0;j<n;j++){
                          matrixshow[n][j]
          +=matrix[j][i];
                      }

                  }

                  
                  
          for(int i=0;i<n;i++){
                          matrixshow[n][n]
          +=matrix[i][i];
                  }

                  
                  JPanel tempJPanel
          =new JPanel();
                  tempJPanel.setLayout(
          new GridLayout(n+2,n+1));
                  JLabel jlabel[][]
          =new JLabel[n+2][n+1];
                  
          for(int i=0;i<n+2;i++){
                      
          for(int j=0;j<n+1;j++){
                          
          if(i==0){
                              jlabel[i][j]
          =new JLabel(""+(j+1),JLabel.CENTER);
                          }

                          
          else  jlabel[i][j]=new JLabel(""+matrixshow[i-1][j],JLabel.CENTER);
                          jlabel[i][j].setBorder(BorderFactory.createLineBorder(Color.green));
                          
          if(i==n+1||j==n){
                              jlabel[i][j].setBackground(Color.pink);
                              jlabel[i][j].setOpaque(
          true);
                          }

                          
          if(i==0&&j!=n){
                              jlabel[i][j].setBackground(Color.cyan);
                              jlabel[i][j].setOpaque(
          true);
                          }

                          tempJPanel.add(jlabel[i][j]);
                          
                      }

                  }

                  
          return tempJPanel;
              }

              
              
          public static void main(String args[]){
                  MagicMatrix application
          =new MagicMatrix();
                  application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              }

          }

          /Files/littlefermat/src.rar

          posted on 2007-12-21 23:02 littlefermat 閱讀(833) 評論(0)  編輯  收藏


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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 关岭| 德阳市| 松江区| 酒泉市| 石棉县| 泗水县| 廊坊市| 安远县| 伊吾县| 仪征市| 芦山县| 通江县| 曲松县| 八宿县| 黔南| 白朗县| 丹巴县| 改则县| 灵山县| 利辛县| 江口县| 大荔县| 沾益县| 始兴县| 乡宁县| 新竹县| 临泽县| 吴旗县| 郸城县| 宁安市| 桑日县| 长海县| 泸水县| 邹城市| 长武县| 固阳县| 日照市| 柘城县| 容城县| 繁峙县| 阜南县|