算法:九宫格问题--奇数阶魔方(Magic-Square)
一、魔方介绍
魔方(这里是简称,也可以叫幻方、魔术矩阵,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,它将绕到 n - 1。同样,如果计算出的列位置变为 n,则它将绕到 0。
- 如果幻方在计算位置处已经包含数字,则计算列位置将减少 2,计算行位置将增加 1。
- 如果计算出的行位置为 -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)的更多相关文章
- HDU 1998 奇数阶魔方【模拟填数/注意边界和细节】
奇数阶魔方 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- 杭电ACM 1998奇数阶魔方
#include<stdio.h>#include <string.h>int main(){ int n,m; int a[40][40]={0}; scanf(" ...
- hdoj 2183 奇数阶魔方(II) 【模拟】+【法】
比赛的时候花了一个多小时,以做不做 分析:可观察:中间是(n*n+1)/2, 中间的上面是n*n,以下是1, 左边是n,右面是(n*n+1)-n,并且正对角线是最左上对到最右下端添加(+1).另外一条 ...
- hdu 1998 奇数阶魔方(找规律+模拟)
应该不算太水吧. 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 ...
- 任意阶魔方阵(幻方)的算法及C语言实现
写于2012.10: 本来这是谭浩强那本<C程序设计(第四版)>的一道课后习题,刚开始做得时候去网上找最优的算法,结果发现奇数和双偶数(4的倍数)的情况下算法都比较简单,但是单偶数(2的倍 ...
- n阶魔方阵(奇数阵)的输出
需求 要求输出1~n²的自然数构成的魔方阵. STEP 1 什么是魔方阵? 魔方阵,古代又称“纵横图”,是指组成元素为自然数1.2…n2的平方的n×n的方阵,其中每个元素值都不相等,且每行.每列以及主 ...
- Java 实现奇数阶幻方的构造
一.设计的流程图如下所示 二.Java 语言的代码实现 package MagicSquare; //奇数幻方的实现 public class Magic_Odd { //n 为幻方的阶数 publi ...
- 【C++小白成长撸】--(续)单偶数N阶魔方矩阵
1 /*程序的版权和版本声明部分: **Copyright(c) 2016,电子科技大学本科生 **All rights reserved. **文件名:单偶数N阶魔方矩阵 **程序作用:单偶数N阶魔 ...
- codeforces 711B B. Chris and Magic Square(水题)
题目链接: B. Chris and Magic Square 题意: 问在那个空位子填哪个数可以使行列对角线的和相等,就先找一行或者一列算出那个数,再验证是否可行就好; AC代码: #include ...
随机推荐
- logstash-input-jdbc 同时同步多个表的情况
input { jdbc { jdbc_connection_string => "jdbc:mysql://localhost:3306/crm?zeroDateTimeBehavi ...
- AtCoder Regular Contest 069 D - Menagerie 枚举起点 模拟递推
arc069.contest.atcoder.jp/tasks/arc069_b 题意:一堆不明身份的动物排成一圈,身份可能是羊或狼,羊一定说实话,狼一定说假话.大家各自报自己的两边是同类还是不同类, ...
- PHP中的日期相关函数(三)
之前我们已经介绍过了 PHP 的一些相关的日期操作对象,今天我们就来学习剩下的那些面向过程的使用方式.当然,如果是和 DateTime 类中相似的方法我们就不再进行介绍了.另外,Date() 和 ti ...
- ubuntu提示:无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用)
root@uni-virtual-machine:/home/uni# apt install apt-transport-https ca-certificates curl software-pr ...
- redis 与java的连接 和集群环境下Session管理
redis 的安装与设置开机自启(https://www.cnblogs.com/zhulina-917/p/11746993.html) 第一步: a) 搭建环境 引入 jedis jar包 co ...
- appium和selenium不同与相同之处
原文来自: https://www.cnblogs.com/zhengshuheng/p/6370398.html selenium是web端的自动化,appium是app端的自动化,它继承了webd ...
- python学习2-博客-蓝图
#!/usr/bin/env python # -*- coding: UTF-8 -*- from flask import Blueprint,Flask #这里创建了一个名称为 'admin' ...
- P6091-[模板]原根
正题 题目链接:https://www.luogu.com.cn/problem/P6091 题目大意 给出一个数\(p\),求出它的所有在\([0,p]\)的原根. 解题思路 原根的定义,\(\de ...
- P4357-[CQOI2016]K远点对【K-Dtree】
正题 题目链接:https://www.luogu.com.cn/problem/P4357 题目大意 平面上给出\(n\)个点,求第\(k\)远的点对距离. 解题思路 \(\text{K-Dtree ...
- P4320-道路相遇,P5058-[ZJOI2004]嗅探器【圆方树,LCA】
两题差不多就一起写了 P4320-道路相遇 题目链接:https://www.luogu.com.cn/problem/P4320 题目大意 \(n\)个点\(m\)条边的一张图,\(q\)次询问两个 ...