N阶幻方入门算法及图解
幻方(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 positionint 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;//生成奇魔方Afor (i = 2; i <= k*k; i++){if ((i - 1) % k == 0)//前一个数是3的倍数row++;else{// if row = 0, then row = n-1, or row = row - 1row--;row = (row + k) % k;// if col = n, then col = 0, or col = col + 1col++;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 Cfor (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 Dfor (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] );}
}
参考文献:
- http://www.cnblogs.com/furzoom/p/furzoom-magic-square.html ↩
- 百度百科:幻方 ↩
N阶幻方入门算法及图解相关推荐
- n*n阶魔方阵c语言程序,N阶幻方入门算法及图解
幻方(Magic Square)1是一种将数字安排在正方形格子中,使每行.列和对角线上的数字和都相等的方法. 幻方有3种不同解法,分别对应于奇数阶, 4*m阶,以及4*m+2阶. 注:部分代码来源网络 ...
- 双偶幻方的c语言算法,单偶阶、双偶阶幻方的巧妙填法
单偶阶.双偶阶幻方的巧妙填法 单偶阶.双偶阶幻方的巧妙填法 人气:150 ℃时间:2019-12-07 19:18:09 优质解答 一.双偶幻方的解法 能被4整除的n阶幻方叫双偶幻方,如8阶.12阶. ...
- 任意阶魔方阵matlab程序,【精品】任意阶魔方阵算法(c语言)
n阶幻方是由前n^2(n的2次方)个自然数组成的一个n阶方阵,其各行.各列及两条对角线所含的n个数的和相等.洛书就是最基本的3×3阶魔方阵,做出某种最恰当的决定,横竖都有3个格. 0的倒数 a-1可以 ...
- 任意阶幻方(魔方矩阵)C语言实现
魔方又称幻方.纵横图.九宫图,最早记录于我国古代的洛书.据说夏禹治水时,河南洛阳附近的大河里浮出了一只乌龟,背上有一个很奇怪的图形,古人认为是一种祥瑞,预示着洪水将被夏禹王彻底制服.后人称之为&quo ...
- 【排序算法】图解直接插入排序(图解堪比Debug显示每次循环结果)
[排序算法]图解直接插入排序(图解堪比Debug分析每次循环结果) 写在前面: 本文主要介绍直接插入排序算法,通过图片一步步解释每一趟每一次的后移.代码通过C#实现,并输出每一次交换的情况和比较次数, ...
- 【新手上路】语法入门算法入门题单
作者:王清楚 链接:[新手上路]语法入门&算法入门题单_ACM竞赛_ACM/CSP/ICPC/CCPC/比赛经验/题解/资讯_牛客竞赛OJ_牛客网 来源:牛客网 介绍:本题单分为语法入门和算法 ...
- 由n阶幻方问题引发的思考
由n阶幻方问题想到的 前序 最近在学习一些经典的算法,搞得头昏脑涨,就想换换脑子.在家里的旧书堆里面乱翻,无意中将一本具有十多年历史的小学数学奥林匹克竞赛的书发掘了出来,能放到现在挺不容易的,就拿起来 ...
- 任意阶幻方的python编程实现
摘要:提出任意阶幻方的python语言的实现方法,分为奇数阶,偶数阶(n为整数,分为4n阶和4n+2阶幻方),速度还算可以,你可以体会以下.测试999阶幻方可以算出来: 1,什么是幻方 幻方(Magi ...
- Matlab 基础应用01 - Python 基础应用 n阶幻方【MagicSquare】和构造
前言: 本章介绍幻方的基本知识,同时利用Matlab 和 Python 构造简单的幻方方阵. 最后用幻方结合图像,展示了一个渐进的魔幻效果. 幻方定义: 简单介绍 幻方(Magic Square)是一 ...
最新文章
- VMware虚拟机 取消 简易安装
- datagrid加checkbox实现分页不丢失选择的记录 (转)
- pptv网络电视android,PP视频(原聚力视频)
- JAVA——操场跑步路径定位模拟解决方案
- Windows与Linux的主要区别
- 重磅!K8S 1.18版本将内置支持SideCar容器。
- MySQL千万数据量深分页优化
- 新书上市《软件设计师考试考前冲刺预测卷及考点解析(最新版)》
- 【Hadoop篇】--Hadoop常用命令总结
- [Python设计模式] 第13章 造小人——建造者模式
- Windows Server 2016-抢占FSMO角色
- Unity 3D下载安装教程
- 如何让移动端出现横向滚动条_纯css实现移动端横向滑动列表overflow:atuo;隐藏滚动条...
- HTML5 新特性 - WebSocket实现聊天(群聊天室、一对一聊天)
- The credentials mode of request initiated by the XMLHttpRequest is controlled by the withCredentials
- 一文读懂自学机器学习的误区和陷阱(附学习资料)
- 触摸按键(电容式按键)
- 关于车贷你需知道的那些事儿
- C语言——指针详细讲解
- 【mcuclub】矩阵键盘
热门文章
- 【贪心】加工生产调度(双机调度贪心问题)
- The Rust Programming Language - 第11章 测试 - 11.1 编写测试
- springBoot+itext处理富文本转pdf
- 从零开始的纪中生活(7.11~7.22)
- Java集合中Set
- matlab数组 xp,windowsxp系统将matlab数据导入excel的方法
- cdn投资骗收租_为研究直播的投资点,才意识到CDN对内容分发的基础性意义。迟到3年才看到这一点,错过20倍的网宿科技...
- CZ880到手第一天测试,安装Windows11 To Go
- 创业者的心得:心有菩提手有刀,欲成舍利却成妖(转)
- 测试用例详解用例模板