一、魔方介绍

  魔方(这里是简称,也可以叫幻方、魔术矩阵Magic Square)是 n×n 正方形网格(n 为每侧的单元数),里面每个单元格填充了不同的正整数 1, 2, 3, ... , n2并且每一行、每一列和对角线中的正整数之和相等每行、每列以及对角线上的单元格里的正整数之和又叫做魔术常数魔方的魔术和

幻方历史:

  《系辞》云:“河出图,洛出书,圣人则之。”在宋朝之前,洛书的记述只有文字。

  九宫图实物最早发现于西汉,1977年中国考古学家在安徽阜阳县双古堆西汉古墓中发现汉文帝七年(前173年)的太乙九宫占盘,乃是中国汉代幻方的实物。东汉《数术记遗》也有记载。

  后来陈抟以降认为河图洛书的洛书代表九宫图,为 1...9 这 9 个数,而 3 行、3 列以及两对角线上各自的数之和均为 15。

二、奇数阶幻方构造法

  幻方可以使用 N 阶方阵来表示,方阵的每行、每列以及两条对角线的和都等于常数 M2(N),如果填充数 1, 2, ... , N2,那么有

  三个成立条件:

  1. 下一个数字的位置是通过将前一个数字的行号减 1,再将前一个数字的列号加 1来计算的。在任何时候,如果计算出的行位置变为 -1,它将绕到 n - 1。同样,如果计算出的列位置变为 n,则它将绕到 0。
  2. 如果幻方在计算位置处已经包含数字,则计算列位置将减少 2,计算行位置将增加 1
  3. 如果计算出的行位置为 -1 且计算出的列位置为 n,则新位置将为:(0, n-2)

  其时间复杂度为 O(n2)。

三、奇数阶幻方构造代码

 1 package algorithm;
2
3 /**
4 * 奇数阶魔方矩阵
5 */
6 public class MagicSquare {
7 /**
8 * 生成奇数阶魔方矩阵(n*n), 魔方里面填充范围内不同的正整数:1, 2, 3, ... , n^2
9 *
10 * @param n 奇数阶
11 */
12 private static void generateSquare(int n) {
13 int[][] magicSquare = new int[n][n];
14
15 /**
16 * 初始化正整数1的位置
17 */
18 int i = n / 2; // row
19 int j = n - 1; // column
20
21 /* 把一个个树填充进魔方中 */
22 for (int num = 1; num <= n * n;) {
23 if (i == -1 && j == n) { // 条件3
24 j = n - 2;
25 i = 0;
26 } else {
27 if (j == n)  // 条件1
28 j = 0;
29 if (i < 0)
30 i = n - 1;
31 }
32
33 if (magicSquare[i][j] != 0) {  // 条件2
34 j -= 2;
35 i++;
36 continue;
37 } else {
38 magicSquare[i][j] = num++; // 把一个个正整数填进对应位置
39 }
40 j++;
41 i--;
42 }
43
44 System.out.println("The Magic Square for " + n + ":"); // 打印魔方的阶数
45 System.out.println("Sum of each row or column " + (n * (n * n + 1) / 2) + ":"); // 打印此魔方的魔术常数,即每行、每列、对角线之和
46
47 /* 打印魔方方阵 */
48 for (i = 0; i < n; i++) {
49 for (j = 0; j < n; j++) {
50 System.out.print(magicSquare[i][j] + " ");
51 }
52 System.out.println();
53 }
54 }
55
56 public static void main(String[] args) {
57 /* n为奇数时有效 */
58 int n = 5;
59 generateSquare(n);
60 }
61 }

算法:九宫格问题--奇数阶魔方(Magic-Square)的更多相关文章

  1. HDU 1998 奇数阶魔方【模拟填数/注意边界和细节】

    奇数阶魔方 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  2. 杭电ACM 1998奇数阶魔方

    #include<stdio.h>#include <string.h>int main(){ int n,m; int a[40][40]={0}; scanf(" ...

  3. hdoj 2183 奇数阶魔方(II) 【模拟】+【法】

    比赛的时候花了一个多小时,以做不做 分析:可观察:中间是(n*n+1)/2, 中间的上面是n*n,以下是1, 左边是n,右面是(n*n+1)-n,并且正对角线是最左上对到最右下端添加(+1).另外一条 ...

  4. hdu 1998 奇数阶魔方(找规律+模拟)

    应该不算太水吧. 17  24   1   8  15   23   5   7  14  16    4   6  13  20  22   10  12  19  21   3   11  18 ...

  5. 任意阶魔方阵(幻方)的算法及C语言实现

    写于2012.10: 本来这是谭浩强那本<C程序设计(第四版)>的一道课后习题,刚开始做得时候去网上找最优的算法,结果发现奇数和双偶数(4的倍数)的情况下算法都比较简单,但是单偶数(2的倍 ...

  6. n阶魔方阵(奇数阵)的输出

    需求 要求输出1~n²的自然数构成的魔方阵. STEP 1 什么是魔方阵? 魔方阵,古代又称“纵横图”,是指组成元素为自然数1.2…n2的平方的n×n的方阵,其中每个元素值都不相等,且每行.每列以及主 ...

  7. Java 实现奇数阶幻方的构造

    一.设计的流程图如下所示 二.Java 语言的代码实现 package MagicSquare; //奇数幻方的实现 public class Magic_Odd { //n 为幻方的阶数 publi ...

  8. 【C++小白成长撸】--(续)单偶数N阶魔方矩阵

    1 /*程序的版权和版本声明部分: **Copyright(c) 2016,电子科技大学本科生 **All rights reserved. **文件名:单偶数N阶魔方矩阵 **程序作用:单偶数N阶魔 ...

  9. codeforces 711B B. Chris and Magic Square(水题)

    题目链接: B. Chris and Magic Square 题意: 问在那个空位子填哪个数可以使行列对角线的和相等,就先找一行或者一列算出那个数,再验证是否可行就好; AC代码: #include ...

随机推荐

  1. git各种操作:基本操作 and 多人协作 and 冲突解决

    git基本操作 git 上次文件到远程仓库(参考:https://blog.csdn.net/beiqiaofeng123/article/details/104859326) 如果第一次上传,配置一 ...

  2. ElasticSearch集成SpringData史上最全查询教程

    1.简单介绍 springboot 使用springdata操作es,ElasticsearchRepository使用QueryBuilder构造查询条件 2.集成es //maven集成 < ...

  3. NIO.2中Path,Paths,Files类的使用

    Java NIO Java NIO概述 Java NIO(New IO(新io),Non-Blocking IO(非阻塞的io))是从Java 1.4版本开始引入的一套新的IO API,可以替代标准的 ...

  4. [源码解析] 深度学习分布式训练框架 horovod (21) --- 之如何恢复训练

    [源码解析] 深度学习分布式训练框架 horovod (21) --- 之如何恢复训练 目录 [源码解析] 深度学习分布式训练框架 horovod (21) --- 之如何恢复训练 0x00 摘要 0 ...

  5. 机器学习——正则化方法Dropout

    1 前言 2012年,Dropout的想法被首次提出,受人类繁衍后代时男女各一半基因进行组合产生下一代的启发,论文<Dropout: A Simple Way to Prevent Neural ...

  6. 【死磕NIO】— 阻塞、非阻塞、同步、异步,傻傻分不清楚

    万事从最基本的开始. 要想完全掌握 NIO,并不是掌握上面文章([死磕NIO]- NIO基础详解)中的三大组件就可以了,我们还需要掌握一些基本概念,如什么是 IO,5 种IO模型的区别,什么是阻塞&a ...

  7. Mysql实现排序

    排序   SELECT     obj.user_id,obj.score,@rownum := @rownum + 1 AS rownum FROM     (         SELECT     ...

  8. DEDE留言板调用导航的方法

    DEDE留言板调用导航的方法 dede里的留言板guestbook.htm用{dede:include filename="../default/head.htm"/}不能自动生成 ...

  9. redis小结 1-1

    1.1什么是resis Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. 1.2Redis 与其他 key - value 缓存产品有以下三个特点 Redis支持 ...

  10. Abp vNext 番外篇-疑难杂症丨浅谈扩展属性与多用户设计

    说明 Abp vNext基础篇的文章还差一个单元测试模块就基本上完成了我争取10.1放假之前给大家赶稿出来,后面我们会开始进阶篇,开始拆一些东西,具体要做的事我会单独开一个文章来讲 缘起 本篇文章缘起 ...