奇數幻方構造方法:
1)在N*N的第一行中間插入1
2)在插入數據1的的位置的右上方插入數據2,若出邊框,即在1的上邊框,則2的插入位置是向下移動N個位置
3)在插入數據2的右上方插入數據,若出右邊框,則向左移動N個位置,插入3
4)下面的插入數據都是在上一個插入數據的右上角插入,若右上角出了上邊框,則向下移動N個位置;若右上角位置出了右邊框,則向左移動N個位置;若右上角已經被占,則下一個數的位置是上一個數位置的下面;若右上角是整個N*N的最右邊,且被占,則下個插入位置在最右邊位置的下面位置。
如下圖:

代碼如下:
1 package day4; 2 3 public class jiugongge { 4 5 public static void main(String[] args) { 6 int N = 7;//n為奇數 7 int [][]a = new int[N][N]; 8 for (int i = 0; i < N; i++) { 9 for (int j = 0; j < N; j++) { 10 a[i][j]=0; 11 } 12 } 13 int i = 0,j = (N-1)/2; 14 for (int n = 1; n <= N*N; n++) { 15 a[i][j] = n; 16 if (i==0&&j==N-1&&a[i][j]!=0) { 17 i++; 18 }else if (i==0&&j>=0&&j<N-1) { 19 i=N-1; 20 j++; 21 }else if (i>0&&i<=N-1&j==N-1) { 22 j=0; 23 i--; 24 }else if (a[i-1][j+1]!=0) { 25 i++; 26 }else { 27 j++; 28 i--; 29 } 30 } 31 32 33 for (int ii = 0; ii < N; ii++) { 34 for (int jj = 0; jj < N; jj++) { 35 System.out.print(a[ii][jj]+"\t"); 36 } 37 System.out.println(); 38 } 39 } 40 41 }
分五類討論:
1最右上角一種
2最上面一行(不包括最右上角的那一個)
3最右邊一列(同樣不包括最右上角的那一個)
4右上角占用
5正常狀態