java實現求解n宮格
n宮格:奇數階宮格,使用1-n×n填入其中,使得每一行、每一列、正斜線和反斜線上每n個數的和都相等。
解法:使用網上已有演算法,具體見附錄。
附錄:public class N_nine { public static void main(String[] args){ solution(5); } public static void solution(int n){ int[][] nine=new int[n][n]; if(n%2==0){ System.out.println("偶數格無法求解!"); return; } int i,j; i=0;j=n/2; int step; for(step=1;step<=n*n;++step){ nine[i][j]=step; //System.out.println(i+" "+j+" step: "+step+" nine:"+nine[i][j]); i=i-1; j=j+1; if(i==-1 && j==n){ i=i+2; j=j-1; } if(i==-1){ i=n-1; } if(j==n){ j=0; } if(nine[i][j]!=0){ i=i+2; j=j-1; } } for(int ii=0;ii<n;++ii){ for(int jj=0;jj<n;++jj){ System.out.print(nine[ii][jj]+" "); } System.out.println(); } } }
九宮格題解法(此方法同樣適用於二十五宮格
四十九宮格、八十一宮格)
九宮格涉及的數字少,怕講不清楚,現以二十五宮格為例,講解此類題的做法:
例題:請把1—25個數字放入下列空格中,要求做到橫、縱、斜角相加均等於65
(所給的數字如有負數或沒有按順序排列,請先把數字按從小到大的順序進行排列)
第一步:最小的數必須放在最上一行的最中間格。
1 |
第二步:第二小的數必須放在最小數所在列右列的最下格。
1 |
2 |
第三步:往右上格填寫第三小的數,只要碰到最右列壁,就將下一個數填入上一行的最左側格(如3碰到最右列壁後,4則填在上一行的最左側格)。後面以此類推。
1 |
4 |
3 |
2 |
第四步:若右上方有格就一直填下一個數字,若右上方有數字就在上一個數字的下一格填下一個數,(如下圖4的右上方有空格就填5,如5的右上方有空格就填6,但1早佔了5右上格的位置,因此6就填在5的下一格)。後面以此類推。
1 |
8 |
5 |
7 |
4 |
6 |
3 |
|
2 |
第五步:在最上行碰壁後,下一個數要填入右列的最下格(如2、9的填法)。後面以此類推。
1 |
8 |
5 |
7 |
4 |
6 |
3 |
|
2 |
9 |
第六步:重複前面的規律。
1 |
8 |
15 |
5 |
7 |
14 |
4 |
6 |
13 |
10 |
12 |
3 |
11 |
2 |
9 |
第七步:右上角的下一個數,必定在其下一格。如16必定在15的下一格。
1 |
8 |
15 |
|
5 |
7 |
14 |
16 |
4 |
6 |
13 |
|
10 |
12 |
3 |
|
11 |
2 |
9 |
第八步:還是重複前面的規律。
17 |
24 |
1 |
8 |
15 |
23 |
5 |
7 |
14 |
16 |
4 |
6 |
13 |
20 |
22 |
10 |
12 |
19 |
21 |
3 |
11 |
18 |
25 |
2 |
9 |
此類題的規律:
1、最小值永遠在最上行的中間格,最大值永遠在最下行的中間格。
2、最上行碰壁,下一個數填入右列最下格。
3、最右列碰壁,下一個數填入上一行最左格。
4、右上格有空就一直填下一個數;右上格有數,就將下一個數字填入上一個數的下一格。
5、右上角的下一個數,必定在其下一格;左下角的上一個數,必定在其上一格。
不知道講明白沒有。如果看懂了大家不妨用這個方法試試填9宮格、49宮格、81宮格。