1. 程式人生 > >求N奇數階幻方

求N奇數階幻方

篩選 str ava cal http col imp alpha 右上角

1. 如果矩陣技術分享圖片滿足條件,那麽對任意技術分享圖片,技術分享圖片也滿足條件。
證明顯然。

技術分享圖片為奇數,我們現在構造一個n階幻方包含0到技術分享圖片所有數
技術分享圖片
這裏x,y滿足同余式
技術分享圖片
技術分享圖片待確定。

由於該方程組的系數矩陣的行列式為1,所以對任意i,j有唯一解。我們接下來確定a,b:

首先驗證每行每列的和均相等,即技術分享圖片

由於對任意i,,當x取遍模n的剩余類時,也會取遍所有的剩余類

故每行的和為:技術分享圖片
同理驗證每列。

對於對角線:令b = n - 1, a = (n-1)/2,可以驗證y = (n - 1)/2, x = i
所以其和為:n*(0 + ... n - 1) + n(n - 1)/2 = n(n-1)(n+1)/2 = n(n^2 - 1)/2

偶數不成立是因為, (n-1)/2不能整除。
==========
這種用同余式構造組合結構的方法很常見,比如拉丁方的構造、n皇後問題的構造等。

作者:Changlong Wu
鏈接:https://www.zhihu.com/question/30498489/answer/48393702
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
 1
import java.util.Scanner; 2 //奇數階幻方的實現 3 public class Main { 4 //n為用戶輸入的n階奇數幻方 n為奇數 5 public static int[][] magicOdd(int n) { 6 //構造一個(n+2)*(n+2)矩陣 7 int[][] square = new int[n + 1][n + 1]; 8 int i = 0; 9 int j = (n + 1) / 2; 10 //從第一行的中間那個數字(是1)開始填幻方
11 //n階幻方一共有n*n個數字(從1~n*n) 12 //奇數階幻方的實現算法 13 for (int key = 1; key <= n * n; key++) { 14 if ((key % n) == 1) 15 i++; 16 else { // //填充當前數的右上角那個數 17 i--; 18 j++; 19 } 20 if (i == 0) { ////
判斷條件:若是在(n+2)*(n+2)階方陣的第一行 21 i = n; 22 } 23 if (j > n) { 24 j = 1; 25 } 26 square[i][j] = key; 27 } 28 29 //對(n+2)*(n+2)階的方陣進行篩選出中間的n*n階幻方 30 31 int[][] matrix = new int[n][n]; 32 33 for (int k = 0; k < matrix.length; k++) { 34 35 for (int l = 0; l < matrix[0].length; l++) { 36 matrix[k][l] = square[k + 1][l + 1]; 37 } 38 } 39 return matrix; 40 } 41 public static void main(String[] args) { 42 Scanner a = new Scanner(System.in); 43 int b = a.nextInt(); 44 //b為用戶輸入的奇數 45 System.out.println(); 46 int[][] magic = Main.magicOdd(b); 47 for (int k = 0; k < magic.length; k++) { 48 for (int l = 0; l < magic[0].length; l++) { 49 System.out.print(magic[k][l] + " "); 50 } 51 System.out.println(); 52 } 53 } 54 }

求N奇數階幻方