求N奇数阶幻方

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 }
时间: 2024-11-06 22:03:24

求N奇数阶幻方的相关文章

Java 实现奇数阶幻方的构造

一.设计的流程图如下所示 二.Java 语言的代码实现 package MagicSquare; //奇数幻方的实现 public class Magic_Odd { //n 为幻方的阶数 public static int[][] magicOdd(int n) { //构造一个(n+2)*(n+2)阶的方阵 int[][] square = new int[n + 1][n + 1]; int i = 0; int j = (n + 1) / 2; //从第一行的中间那个数字(是1)开始填幻

Java 实现任意N阶幻方的构造

一.关于单偶数阶幻方和双偶数阶幻方 (一)单偶数阶幻方(即当n=4k+2时) 任何4k+2 阶幻方都可由2k+1阶幻方与2×2方块复合而成,6是此类型的最小阶. 以6阶为例,可由3阶幻方与由0,1,2,3组成的2×2的小方块拼成一个6×6的大方块复合而成. 其中,3阶幻方(洛书)如下图1所示, (图1) 800x600 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 /* Sty

n阶幻方问题

转载自:http://blog.csdn.net/fengchaokobe/article/details/7437767 目录        第一节 n阶幻方问题       第二节 由n阶幻方引发的思考 正文 第一节 n阶幻方问题 所谓n阶幻方问题,俗称“横竖斜相加和相等”(我们当时就是这么叫的).用术语说就是:在一个N行N列的方格表中,有1,2,3......N*N-1,N*N这N*N个整数,且其对角线.横行.纵行的数字和都相等.       好了,在具体详解该问题之前,我们先看个例子,熟

任意阶幻方(魔方矩阵)C语言实现

魔方又称幻方.纵横图.九宫图,最早记录于我国古代的洛书.据说夏禹治水时,河南洛阳附近的大河里浮出了一只乌龟,背上有一个很奇怪的图形,古人认为是一种祥瑞,预示着洪水将被夏禹王彻底制服.后人称之为"洛书"或"河图",又叫河洛图. 南宋数学家杨辉,在他著的<续古摘奇算法>里介绍了这种方法:只要将九个自然数按照从小到大的递增次序斜排,然后把上.下两数对调,左.右两数也对调:最后再把中部四数各向外面挺出,幻方就出现了. (摘自<趣味数学辞典>) 在西方

算法:九宫格问题--奇数阶魔方(Magic-Square)

一.魔方介绍 魔方(这里是简称,也可以叫幻方.魔术矩阵,Magic Square)是 n×n 正方形网格(n 为每侧的单元数),里面每个单元格填充了不同的正整数 1, 2, 3, ... , n2,并且每一行.每一列和对角线中的正整数之和相等.每行.每列以及对角线上的单元格里的正整数之和又叫做魔术常数或魔方的魔术和. 幻方历史: <系辞>云:“河出图,洛出书,圣人则之.”在宋朝之前,洛书的记述只有文字. 九宫图实物最早发现于西汉,1977年中国考古学家在安徽阜阳县双古堆西汉古墓中发现汉文帝七年

N(奇数)阶幻方-java实现代码

看完最强大脑,有一期是说N阶幻立方的,作为一个程序员,我的第一反应时我可以用程序实现,在此公布N(奇数)阶幻方的java实现代码: package com.lzugis.test; public class Practice { public static int[][] magicOdd(int n) { int[][] square = new int[n + 1][n + 1]; int i = 0; int j = (n + 1) / 2; for (int key = 1; key <

任意阶幻方的c++实现----奇阶幻方、双偶幻方、单偶幻方。

幻方分为3类.奇阶幻方(奇数).双偶幻方(能够被4整除,如8,12,16--).单偶幻方(4m+2形式,如6,10--),构造算法各不相同. 下面的程序中,奇阶幻方的构造算法为Merzirac法.双偶幻方的构造算法为Spring法.单偶幻方的构造算法为Strachey法. 单偶幻方: 在第一行居中的方格内放1,依次向右上方填入2.3.4-,如果右上方已有数字,则向下移一格继续填写. 参考:http://blog.csdn.net/zheng0518/article/details/9006281

codeforces 710C Magic Odd Square(构造或者n阶幻方)

Find an n × n matrix with different numbers from 1 to n2, so the sum in each row, column and both main diagonals are odd. Input The only line contains odd integer n (1 ≤ n ≤ 49). Output Print n lines with n integers. All the integers should be differ

CodeForces - 710C Magic Odd Square(奇数和幻方构造)

Magic Odd Square Find an n × n matrix with different numbers from 1 to n2, so the sum in each row, column and both main diagonals are odd. Input The only line contains odd integer n (1 ≤ n ≤ 49). Output Print n lines with n integers. All the integers