N阶幻方入门算法及图解

任意偶阶幻方构建法 任意偶阶幻方构建法(图解,新编) 偶阶幻方的构建,通常分为单偶、双偶来研讨,且多数是通过高等数学知识来构造的。本人多年前发现了任意偶阶幻方的初等数学算术排列法,可以使普通读者一看就懂。结合原来算术排列法的规则,利用图解法构建任意偶阶幻方,不分单、双偶。有点新意,录此备忘。 下面,以10阶幻方为例,说明排列的步骤。 为了便于描述,根据数学习惯,把图中中横线称为横轴x,中竖线称为纵轴y,如图一: 1、求定位点: 把所求数列由外向里依次连续填写在纵轴右侧,并同时连续填充中间4×4矩阵。 2、取定位点——关键点取法 阅读详情

幻方(Magic Square)1是一种将数字安排在正方形格子中,使每行、列和对角线上的数字和都相等的方法。
幻方有3种不同解法,分别对应于奇数阶, 4*m阶,以及4*m+2阶。
注:部分代码来源网络2

奇数阶幻方解法

英姑对黄蓉说:“你算法自然精我百倍,可是我问你:将一至九这九个数字排成三列,不论纵横斜角,每三个字相加都是十五,如何排列?”
黄蓉当下低声诵道:“九宫之意,法以灵龟,二四为肩,六八为足,左三右七,戴九履一,五居中央。”边说边画,在沙上画了一个九宫之图。
——金庸《射雕英雄传》第二十九回黑沼隐女
黄蓉给出的结果为:
4 9 2
3 5 7
8 1 6
更通用的解法如下:
1、把1填在第一行中央位置;
2、从2开始,每个数填在上一个数的左上角位置,越界则取模。
3、若左上角有数,则改填在上一个数的正下方。
上文中“左上角,正下方”可以改为其他对称情况,如黄蓉用的“右下角,正上方”。
代码如下:

void Magic_Odd(vector<vector<int> > &a)
{
    int n = a.size();

    int count = 2;
    int  x = 0, y = n / 2;
    a[x][y] = 1;
    while (count <= n*n)
    {
        // get the new position
        int x2 = (x - 1 + n) % n;
        int y2 = (y - 1 + n) % n;
        if (a[x2][y2])
        {
            x2 = (x + 1 + n) % n;// position is not valid, get next row.
            y2 = y;
        }
        x = x2;
        y = y2;

        a[x2][y2] = count++;
    }
}

4*m阶幻方解法

黄蓉笑道:“不但九宫,即使四四图,五五图,以至百子图,亦不足为奇。“就说四四图罢,以十六字依次作四行排列,先以四角对换,一换十六,四换十三,后以内四角对换,六换十一,七换十。这般横直上下斜角相加,皆是三十四。
——金庸《射雕英雄传》第二十九回黑沼隐女
通用的做法如下:
1、从数字1开始从小到大,即从左到右,从上到下进行填充;
2、将魔方中间n/2列的元素上、下进行翻转;
3、将魔方中间n/2行的元素左、右进行翻转。
这里写图片描述

void Magic_4m(vector<vector<int> > &a)
{
    int n = a.size();
    int count = 1;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
            a[i][j] = count++;
    }

    // swap 
    for (int j = n/4 ; j < n/4 *3; ++j)
    {
        for (int i = 0; i < n/2; i++)
            swap(a[i][j], a[n - 1 - i][j]); // mid 2 col
    }

    for (int j = n / 4; j < n / 4 * 3 ; ++j)
    {
        for (int i = 0; i < n / 2; i++)
            swap(a[j][i], a[j][n - 1 - i]); // mid 2 row
    }

}

4*m+2阶幻方解法

这个就比较麻烦点了。需要将矩阵分块后一一解决。
1、将魔方分成A、B、C、D四个k阶方阵,如下图这四个方阵都为奇方阵,依次将A、D、B、C填充为奇魔方。
A B
C D
2、交换A、C魔方元素:
对魔方的中间行,交换从中间列向右的m列各对应元素;
对其他行,交换从左向右m列各对应元素。
3、交换B、D魔方元素:
交换从中间列向左m – 1列各对应元素。
这里写图片描述

void Magic_4m_2(vector<vector<int> > &a)
{
    int n = a.size();
    int i, k, temp;
    int col, row;// col 列,row 行

    //初始化
    k = n / 2;
    col = (k - 1) / 2;
    row = 0;
    a[row][col] = 1;

    //生成奇魔方A
    for (i = 2; i <= k*k; i++)
    {
        if ((i - 1) % k == 0)//前一个数是3的倍数
            row++;
        else
        {
            // if row = 0, then row = n-1, or row = row - 1
            row--;
            row = (row + k) % k;

            // if col = n, then col = 0, or col = col + 1
            col++;
            col %= k;
        }
        a[row][col] = i;
    }

    //根据A生成B、C、D魔方
    for (row = 0; row < k; row++)
    {
        for (col = 0; col < k; col++)
        {
            a[row + k][col + k] = a[row][col] + k*k;
            a[row][col + k] = a[row][col] + 2 * k*k;
            a[row + k][col] = a[row][col] + 3 * k*k;
        }
    }

    // Swap A and C
    for (row = 0; row < k; row++)
    {
        if (row == k / 2)//中间行,交换从中间列向右的m列,n = 2*(2m+1)
        {
            for (col = k / 2; col < k - 1; col++)
                swap(a[row][col], a[row + k][col]);
        }
        else//其他行,交换从左向右m列,n = 2*(2m+1)
        {
            for (col = 0; col < k / 2; col++)
                swap(a[row][col], a[row + k][col]);
        }
    }

    // Swap B and D
    for (row = 0; row < k; row++)//交换中间列向左m-1列,n = 2*(2m+1)
    {
        for (i = 0; i < (k - 1) / 2 - 1; i++)
            swap(a[row][k + k / 2 - i], a[row + k][k + k / 2 - i] );
    }
}

参考文献:

偶阶幻方镶边法 偶阶幻方的镶边法 ——由低阶幻方构建任意高阶幻方 本文依据《任意偶阶幻方构建法》的规则,来构建由已知低阶偶阶幻方来创建高阶偶阶幻方。《任意偶阶幻方构建法》(图解)写的比较简洁。为此,本文尽可能详尽些,以便幻方爱好者明了。 一、由已知4阶幻方构建6阶幻方 1、把已知4阶幻方填写在所求幻方中央(图一)。 2、为例描述的方便,按数学习惯,把横竖两条中线称为x、y轴。 3、先把中间原4阶幻方数字升为6阶幻方正中段数字(图二),中间各数应加 2(n-1)= 2(6-1)=10 (6阶幻方所镶边的一半格子数) 阅读详情

相关推荐

单偶幻方镶边法

单偶幻方的镶边法 前文《偶阶幻方的镶边法》,介绍由低阶幻方构建任意高价幻方。构造幻方时,由于涉及到构建的幻方有单偶、双偶之分,为了使规则的表述统一,必须要考虑避开G点,有点繁琐。为此,本文专门讨论构建单偶幻方,填写幻方时,无需考虑G点,直接根据规则填写,应该方便些。 把任一单偶幻方,降2阶,即成为双偶幻方。为此,把所求自然数分为三个数列:小数数列、中数数列和大数数列。取个数相等的小数数列和大数数列(简单计算容易得到),置外框;取中数数列双向跳跃填写中间的(n-2)×(n-2)方阵(也可按海尔法填写),马上得

weixin_62126193的博客 745

n 阶幻方问题

前言 这是很久以前做的一个实验的内容,觉得特别有意思,所以一直想发布出来,没想到拖着拖着就到现在了。 问题描述 一个n阶幻方是把从1到n^2的整数赶往一个n阶方阵,每一个数只出现一次,每一行、主副对角线的和都相等。 分析和本文基本概念 分析 据了解,4阶幻方个数的基本型就有880个,通过旋转和反射总共可有7040个不同的形式的,5阶幻方基本型有275 305 224个,6阶幻方的个数非常之多,皮恩...

DoneSpeak的博客 8563

C语言:偶数阶魔方阵的实现(四的倍数)

偶阶魔方阵的实现步骤: 1.用横线和竖线将n阶方阵划分为m个4*4的小方阵; 2.将n*n个数从小到大,从左到右,从上到下依次填入方阵中,遇到4*4小方阵的对角线不填(此位置不填的数不作为下一个位置填入的数) 3.将n*n个数从大到小,从左到右,从上到下依次填入方阵中4*4小方阵的对角线上,其他位置不填(此位置不填的数不作为下一个位置填入的数) 4.偶阶魔方阵完成。 下面进行图解(以8阶...

yy_0733的博客 2112

n阶幻方【MagicSquare】

奇数阶幻方 算法:第0行中间为1, 下一个位置是右上方,如5、6;若越界,将沿行、列方向看成环形,如2、3. 若当前位置是n的倍数,表示一条对角线已满,则下一个位置是本列下一行,如4、7 右上角,出列对折,倍数放在下一行 二维数组存储,元素下标i\j沿行列方向看成环形 i = (i-1+n)%n//向上一行 j = (j+1)%n//向右一列 ...

绀香零八的博客 3065

【华为OD机试真题】121、幻方修复 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

题目描述 >幻方(MagicQ Square) 是一个由1~N^2, >  >共N^2个整数构成的N*N矩阵,满足每行、列和对角线上的数字和相等。 >  上回你已经帮助小明将写错一个数字的幻方进行了修复,小明在感谢之余也想进一步试试你的水平, 于是他准备了有两个数字发生了位置交换的幻方。   你可以把这两个交换的数字找出来并且改正吗?

KJ.JK 1万+

【华为OD机试真题】121、幻方修复 | 机试真题+思路参考+代码解析(C++、Java、Py、JS)

### 🎃题目描述 >幻方(MagicQ Square) 是一个由1~N^2, >  >共N^2个整数构成的N*N矩阵,满足每行、列和对角线上的数字和相等。 >  上回你已经帮助小明将写错一个数字的幻方进行了修复,小明在感谢之余也想进一步试试你的水平, 于是他准备了有两个数字发生了位置交换的幻方。   你可以把这两个交换的数字找出来并且改正吗?

正在更新最新华为OD机试2025B卷,提供OJ在线刷题 1216

【数学】n阶幻方

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

Ariesc_jch 1997

n阶幻方生成算法C++源代码

由1~n²个连续正整数组成的n阶正方形,若它的每个横排,竖排,两条对角线的数字之和均相等,则此正方形可被称为“幻方”。 目前填写幻方的方法,是把幻方分成了三类,即奇数阶幻方、双偶阶幻方、单偶阶幻方,这三种幻方的构造方法均已经被找到。 本人根据网上找到的构造算法,花了一天的休息时间将n阶幻方的生成算法利用C++实现,希望能对大家有所帮助。

N阶幻方是指由1至N*N连续自然数组成的方阵

N阶幻方是指由1至N*N连续自然数组成的方阵

m0_74150589的博客 881

【YOLO 系列】基于YOLOv8的工业零件表面缺陷智能检测系统【python源码+Pyqt5界面+数据集+训练代码】

本文详细介绍了如何基于YOLOv8深度学习模型和PyQt5图形界面,构建一套完整的工业零件表面缺陷智能检测系统。内容涵盖从环境搭建、数据集标注、模型训练调参到最终封装成可执行桌面软件的全流程,并深入解析了YOLOv8在工业视觉场景中的技术优势与落地优化策略。

ol78901234的博客 402

Triton推理服务器实战:如何为PaddleOCR的ONNX模型配置动态批处理和并发推理

本文详细介绍了如何使用Triton推理服务器为PaddleOCR的ONNX模型配置动态批处理和并发推理,以提升GPU利用率和推理性能。通过实战案例和参数调优指南,帮助开发者解决高并发场景下的性能瓶颈问题,实现从实验室到生产环境的高效部署。

weixin_42527160的博客 426

n层正方形图案

一道关于C++数组的题目

m0_73552988的博客 2584

1448•纯粹素数

纯粹素数是这样定义的:一个素数,去掉最高位,剩下的数仍为素数,再去掉剩下的数的最高位,余下的数还是素数。对于每一个数(无论质数合数)x,筛掉所有小于x最小质因子的质数乘以x的数。但我们知道,我们选择的那个质数必须小于那个合数的最小质因子。p3,因为p2>p1,所以这样是筛不到的。唯一会筛的是第一种:p1和p2*p3。c,s肯定小于刚才那个合数,说明肯定对于它已经筛过,然后a肯定小于s,因为s=b。p3,并且保证p1<p2<p3。我们知道,筛掉这个合数的机会有:p1和p2。c,并且a是最小的因子。

SSL_bin的博客 591

n*n阶魔方阵c语言程序,N阶幻方入门算法及图解

幻方(Magic Square)1是一种将数字安排在正方形格子中,使每行、列和对角线上的数字和都相等的方法。幻方有3种不同解法,分别对应于奇数阶, 4*m阶,以及4*m+2阶。注:部分代码来源网络2奇数阶幻方解法英姑对黄蓉说:“你算法自然精我百倍,可是我问你:将一至九这九个数字排成三列,不论纵横斜角,每三个字相加都是十五,如何排列?”黄蓉当下低声诵道:“九宫之意,法以灵龟,二四为肩,六八为足,左三...

weixin_39887926的博客 1153

ABAP内表数据导出Excel:OLE、ALV与GUI_DOWNLOAD方案全解析

在企业级应用开发中,数据导出是连接后台系统与前端业务分析的关键桥梁。其核心原理是将结构化数据转换为通用文件格式,以实现跨平台的数据交换与可视化。从技术价值看,一个健壮的导出功能能显著提升数据处理效率,减少人工干预,是衡量系统实用性的重要指标。常见的应用场景包括报表生成、数据交接和临时数据提取。本文聚焦于SAP ABAP开发领域,深入探讨如何将内表数据高效、稳定地导出至Excel,涵盖了OLE自动化、ALV标准导出以及基于CL_GUI_FRONTEND_SERVICES与GUI_DOWNLOAD的通用方案,并

weixin_32715349的博客 324

AutoSAR实验视频讲解:相关资料下载

AutoSAR实验视频讲解:闪烁一颗LED实验【相关资料下载】 总目录 为了方便大家自己的实验顺利进行,这里我们准备了一些实验中可能用到的资料供大家使用 介绍 这里主要是三个文件: MyApp_Core.0是我们的用户代码,在工程集成那集将会讲解 McalConfig.arxml就是我们的Mcal导出文件,用于导入到DaVinci中生成代码 CAN.dbc文件是我们的通信矩阵文件 以上几个文件都是简单的配置,不具有实际项目的实用性,大家仅供参考 // 顺便吐槽一句:百度网盘的吃相真的难看 下载连接

雪云飞星的博客 6668

奇数阶矩阵,横竖斜加起来都相等算法(罗伯法幻方)

奇数阶矩阵,横竖斜加起来都相等: 给定奇数N,形成N阶矩阵,使得横竖斜加起来都相等。比如N=3: 08 01 06 03 05 07 04 09 02 每一行,每一列,交叉斜加起来都等于15 算法思路分析过程: 一、暴力解法:循环+递归实现全排列组合。此法思路简单,网上不少代码实现的,但是缺点也是很明显的,暴力愚蠢耗资源。 二、排列加上数学分析: 1、∵横竖斜之和全相等,∴每行每列之和=...

pyjavacsql的博客 1万+

Codex 实战 Skills:用 Skill 自动识别并提取 PDF/图片表格数据,效率提升 10 倍

本文介绍如何构建一个多模态文件解析 Skill,用于自动识别和提取 PDF/图片中的表格数据,提升 AI 智能体处理非结构化文档的效率。文章分析了传统方法的局限性,提出分层解析架构(预处理、检测、提取推理、后处理),推荐技术栈包括 pdfplumber、OpenCV 和多模态大模型。详细说明了 Skill 的元数据定义、数据模型设计(使用 Pydantic)和核心实现流程,通过混合策略实现从复杂文档到结构化 JSON/Markdown 的转换,使 AI 代理具备"阅读"多模态文档的能力。

yueyeguzhuo的专栏 308

C/C++——n阶幻方(更新中)

n为奇数例如:n=3输出:8    1     63    5     74    9     2算法:(n为奇数)1、将1放在第一行中间一列;2、从2开始直到n*n止各数依次按下列规则存放:按45度方向行走,如向右上:每一个数存放的行比前一个数的行数减1,列数加1;3、如果行列范围超出矩阵范围,则回绕,例如1在第1行,则2应放在最后一行,列数同样加1;4、如果按上面规则确定的位置上已有数,则把下...

Denglishang的博客 5620

【2024年华为秋招-12月25日-第三题(300分)- PCB印刷电路板布线】(题目+思路+Java&C++&Python解析+在线测试)

在PCB印刷电路板设计中,器件之间的连线需要避免线路的阻抗值增大、而且赛件之间还有别的器件和别的干扰源,在布线时我们希望受到的干扰尽量小。现将电路板简化成一个M×N的矩阵,每个位置(单元格)的值表示其源干扰度。如果单元格的值为0,表示此位置没有干扰源;如果单元格的值为非0,则表示此位置是干扰源,其值为源干扰度。连线经过干扰源或干扰源附近会增加连线的总干扰度。位置Axy的干扰源的源干扰度为dd01、若连线经过位置Axy,则其总干扰度会增加d;2、若连线经过离位置A。

m0_73659489的博客 344

【华为OD机试真题 2025B卷】662、静态扫描 | 机试真题+思路参考+代码解析(C++、Java、Py)(B卷复用)

【华为OD机试真题 2025B卷】662、静态扫描 | 机试真题+思路参考+代码解析(C++、Java、Py)(B卷复用) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2024e卷,od机试,2024E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2024华为od,如何备战华为od

KJ.JK 5398

n阶幻方的构造

 根据构造方法的不同,幻方可以分成三类:奇数阶幻方、4M阶幻方和4M + 2阶幻方,其中M为自然数,2阶幻方不存在。 1 奇数阶幻方构造法 (1) 将1放在第一行中间一列; (2) 从2开始直到n×n止各数依次按下列规则存放:按 45°方向行走,向右上,即每一个数存放的行比前一个数的行数减1,列数加1 (3) 如果行列范围超出矩阵范围,则回绕。例如1在第1行,则2应放在最下一行,列

zzulp的专栏 6477

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【算法导论】幻方算法概述及Python实现

幻方算法是一种数学算法,旨在创建一个特定大小的方阵,其中每个单元格都包含唯一的数字,以及满足特定条件的数字总和。在幻方算法中,每个数字只出现一次,而且每一行,每一列和对角线的数字之和都相等。

在岗Golang后端开发,分享一些日常笔记和代码 1885

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

python生成幻方

幻方是将从1到若干个数的自然数排成纵横各为若干个数的正方形,使在同一行、同一列和同一对角线上的几个数的和都相等。古时候幻方经常在官府、学堂等场所出见,后来通过印度、阿拉伯等地传到西方,因其奇幻的特性,被称为Magic Square,即“幻方”或“魔方”。用数学语言表述,幻方是指在n×n(n行n列)的方格里,既不重复又不遗漏地填上n个连续的自然数,每个数占一格,并使排在任一行、任一列和两条对角线上的几个自然数的和都相等,这个和叫幻和,n叫幻方的阶,这样的数表叫n阶幻方。主对角线的和: 65。

T20151470的博客 2209

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

九宫图、四四图、五五图and so on

参考自百度百科 n行n列的纵横图又称为幻方。 九宫图: 在射雕里面,黄蓉对瑛姑说的一段口诀很好记忆:“九宫之义,法以灵龟。二四为肩,六八为足,左三右七,戴九履一,五居中央。” 最简单的幻方就是平面幻方,还有立体幻方、高次幻方等。对于立体幻方、高次幻方目前世界上很多数学家仍在研究,现在只讨论平面幻方。   对平面幻方的构造,分为三种情况:N为奇数、N为4的倍数、N为其它偶数

natural2u 1万+

python求解数独/幻方

回溯算法求解数字游戏

KEEP CODING 641
上一篇: 论文、文档必备Word技巧
下一篇: 快节奏多人在线游戏网络入门系列教程(1):简介
lsldd
lsldd 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄19年 1494粉丝 63原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值