目录

一、奇数

二、双偶

三、双偶


魔方阵,是指组成元素为自然数1、2、…、n2的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。

魔方阵的规律

一、奇数

阶数为奇数n(n = 1,3,5...)

(1)将1放在第一行中间一列。
(2)从2开始到n*n,每一个数存放的行在之前一个数的行数减1,列数加1。如果当前数字在第一行,那么下一个数字的行数就在最后一行,同理,如果数字在最后一列,那么下一个数字的列数就在第一列。
(3)当前数字的位置已经被之前的数字占据了位置,则防放在前一个数字的下一行,同一列。

代码如下:

#define  ROW 3
void SMagicSquare()
{int arr[ROW][ROW] = {0};arr[0][ROW/2] = 1;//将第一个数字放在第一行中间一列int currow = 0;//当前数据存放的行int curcol = ROW/2;//当前数据存放的列int i = 0;int j =0;for(int i = 2;i <=ROW*ROW;i++){if(arr[(currow+ROW-1)%ROW][(curcol+1)%ROW] != 0){currow =(currow+1+ROW) %ROW;}else{currow = (currow-1+ROW) %ROW;curcol = (curcol+1+ROW)%ROW;}arr[currow][curcol] = i;}//打印此方阵for(int i = 0;i<ROW;i++){for(int j = 0;j<ROW;j++){printf("%-5d",arr[i][j]);}printf("\n");}
}

二、双偶

阶数为4n(n=1,2,3...)

(1) 将整个方阵划分成k*k个4阶方阵,然后在每个4阶方阵的对角线上做记号;

(2) 由左而右、由上而下,遇到没有记号的位置才填数字,但不管是否填入数字,每移动一格数字都要加1;

(3) 自右下角开始,由右而左、由下而上,遇到没有数字的位置就填入数字,但每移动一格数字都要加1。

代码如下:

#define N 4
void DDMagicSquare()
{int arr[N][N] = {0};int i;int j;int lvalue = 1;int rvalue = N*N;for(i = 0;i<N;i++){for(j = 0;j<N;j++){if(i%4 == j%4 || (i+j)%4 == 3){arr[i][j] = rvalue;}else{arr[i][j] = lvalue;                }lvalue++;rvalue--;}}for(i = 0;i<N;i++){for(j =0;j<N;j++){printf("%-3d",arr[i][j]);}printf("\n");}
}

三、双偶

阶数为4n+2(n=1,2,3...)

(1)将整个方阵划分成k*k个4阶方阵,这四个方阵都为奇方阵,利用上面讲到的方法依次将A、D、B、C填充为奇魔方。

(2)交换交换A、C魔方元素,对魔方的中间行,交换从中间列向右的n列各对应元素;对其他行,交换从左向右n列各对应元素。

(3)交换B、D魔方元素,交换从中间列向左m – 1列各对应元素。

代码如下:

#define  MAX 10void SDMagicSquare()
{int i = 0;int j = 0;int arr[MAX][MAX] = {0};arr[0][MAX/4] = 1;int currow = 0;int curcol = MAX/4;//左上方阵/for(i =2;i<=MAX*MAX/4;i++){if(arr[(currow-1+MAX/2)%(MAX/2)][(curcol+1)%(MAX/2)] != 0){currow = (currow+1)%(MAX/2);}else{currow = (currow-1+MAX/2)%(MAX/2);curcol = (curcol+1)%(MAX/2);}arr[currow][curcol] = i;}//右上方阵/arr[MAX/2][MAX*3/4] = MAX*MAX/4+1;currow = MAX/2;curcol = MAX*3/4;for(i = MAX*MAX/4+2;i<=MAX*MAX/2;i++){if(arr[(currow-1+MAX/2)%(MAX/2)+MAX/2][(curcol+1+MAX/2)%(MAX/2)+MAX/2]  != 0){currow = (currow+1)%(MAX/2)+MAX/2;}else{currow = (currow-1+MAX/2)%(MAX/2)+MAX/2;curcol = (curcol+1)%(MAX/2)+MAX/2;}arr[currow][curcol] = i;}//左下方阵/arr[0][MAX*3/4] = MAX*MAX/2+1;currow = 0;curcol = MAX*3/4;for(i = MAX*MAX/2+2;i<=MAX*MAX*3/4;i++){if(arr[(currow-1+MAX/2)%(MAX/2)][(curcol+1+MAX/2)%(MAX/2)+MAX/2]  != 0){currow = (currow+1)%(MAX/2);}else{currow = (currow-1+MAX/2)%(MAX/2);curcol = (curcol+1)%(MAX/2)+MAX/2;}arr[currow][curcol] = i;}//右下方阵/arr[MAX/2][MAX/4] = MAX*MAX/4*3+1;currow = MAX/2;curcol = MAX/4;for(i = MAX*MAX/4*3+2;i<=MAX*MAX;i++){if(arr[(currow-1+MAX/2)%(MAX/2)+MAX/2][(curcol+1+MAX/2)%(MAX/2)]  != 0){currow = (currow+1)%(MAX/2)+MAX/2;}else{currow = (currow-1)%(MAX/2)+MAX/2;curcol = (curcol+1)%(MAX/2);}arr[currow][curcol] = i;}int k = MAX/4;//k用来记录小方阵的中间位置int tmp = 0;for(i = 0;i<MAX/2;i++){for(j = 0;j<MAX;j++){if(i == k && j>=k && j<=2*k-1)//交换A,C方阵中间一行对应的数字{tmp = arr[i][j];arr[i][j] = arr[i+MAX/2][j];arr[i+MAX/2][j] = tmp;}if(i != k && j>=0 && j<k)//交换A,C方阵其他行对应的数字{tmp = arr[i][j];arr[i][j] = arr[i+MAX/2][j];arr[i+MAX/2][j] = tmp;}if(j >=MAX/2+MAX/4-k+2 && j<= MAX/2+MAX/4)//交换B,D方阵中间一列对应的数字{tmp = arr[i][j];arr[i][j] =arr[i+MAX/2][j];arr[i+MAX/2][j] =tmp;}}}for(i = 0;i<MAX;i++){for(j=0;j<MAX;j++){printf("%-5d",arr[i][j]);}printf("\n");}
}

魔方阵(奇数,单偶,双偶)相关推荐

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

    幻方分为3类.奇阶幻方(奇数).双偶幻方(能够被4整除,如8,12,16--).单偶幻方(4m+2形式,如6,10--),构造算法各不相同. 下面的程序中,奇阶幻方的构造算法为Merzirac法.双偶 ...

  2. 奇数阶魔方阵算法分析

    奇数阶魔方阵就是指行列数都是吧n(n>=3 且 n%2 == 1)的魔方阵 奇数阶魔方阵的数字规律 通过对奇数阶魔方阵的分析,其中的数字排列有如下的规律: (1)自然数1出现在第一行的正中间: ...

  3. 判断魔方阵c语言程序设计_魔方阵算法及C语言实现

    1 魔方阵概念 2填充的,每一行.每一列.对角线之和均相等的方阵,阶数n = 3,4,5-.魔方阵也称为幻方阵. 例如三阶魔方阵为: 魔方阵有什么的规律呢? 魔方阵分为奇幻方和偶幻方.而偶幻方又分为是 ...

  4. c语言魔方还原程序案例,利用C语言玩转魔方阵实例教程

    魔方阵 魔方阵,古代又称"纵横图",是指组成元素为自然数1.2-n的平方的n×n的方阵,其中每个元素值都不相等,且每行.每列以及主.副对角线上各n个元素之和都相等. 如3×3的魔方 ...

  5. 重温c语言 谭浩强 输出魔方阵 目前只做了基数魔方 以及 双偶幻方,单偶同理

    基数魔方阵 1>第一行中间位取值1 2>然后 后面的n*n -1 个数按以下规则 下一个数是前一个数的  行-1 列 +1  若是行是0 则为n-1:若列是n-1,则为0:若定位后的pos ...

  6. 11-Little prince's trip to Java-偶数魔方阵之双偶魔方阵

    偶数魔方阵分为两种:① 双偶魔方阵 ② 单偶魔方阵 双偶魔方阵 n为偶数,且能被4整除 (n=4,8,12,16,20--) (n=4k,k=1,2,3,4,5--) 阶数为4时: 互补:如果两个数字 ...

  7. 双偶幻方的c语言算法,单偶阶、双偶阶幻方的巧妙填法

    单偶阶.双偶阶幻方的巧妙填法 单偶阶.双偶阶幻方的巧妙填法 人气:150 ℃时间:2019-12-07 19:18:09 优质解答 一.双偶幻方的解法 能被4整除的n阶幻方叫双偶幻方,如8阶.12阶. ...

  8. 幻方解法之Strachey法生成双偶幻方

    /* 程序思想参考百度百科上"幻方法则" 2015-01-27 http://baike.baidu.com/link?url=7ynfkLYfGv4f7PtQkuH4PSn_8I ...

  9. java解决魔方阵(奇数阶)问题(适合小白!保会)

    魔方阵冲呀 魔方阵的原理通俗点说就是 把1放到第一行中间位置 然后第二个数字向右上移动(行-1,列+1) 列超出行未超出,则放到(行-1,第一列) 行超出列未超出,则放到(最后一行,列加1) 行列均超 ...

最新文章

  1. VMware 接入 Openstack — 使用 Openstack 创建 vCenter 虚拟机
  2. ARPG手游性能分析报告:加载、GC、内存需重点关注
  3. [GXOI/GZOI2019]旧词——树链剖分+线段树
  4. 一个基于Microsoft Azure、ASP.NET Core和Docker的博客系统
  5. 一个不知名的网站复制来的: java怎样连接到SQL server 2008
  6. 使用python中的networkx来生成一个图
  7. 网站制作---asp操作数据库的一个小例子
  8. “互联网+”时代 软件去哪儿啦?
  9. uniapp 调用阿里云OCR身份证识别
  10. Linux系统密码忘记教程
  11. Ubuntu输入法使用回车键后字符间距异常的问题
  12. 纷享销客《快消行业CRM应用与选型指南》重磅发布
  13. 直通车roi提升优化方法 如何判断直通车权重高低
  14. OnLevelWasLoaded 弃用 Unity5.4 新方法 SceneManager.sceneLoaded
  15. pytorch操作基礎(二)——基礎
  16. 选择ip代理软件要看那几点?
  17. nvm安装node,但npm和node不识别
  18. 解析报错   No such provider: BC
  19. 解析流量的核心密码,轻松获取十万精准粉丝!
  20. JavaScript之undefined的加(+)、减(-)、乘(*)、除(/)和取模(%)运算

热门文章

  1. 入门云虚拟主机,为你的业务快速实现数据备份和数据恢复
  2. 给 AI 讲故事,如何教它脑补画面?
  3. “阿里巴巴小程序繁星计划”:20亿扶持200万小程序开发者和100万商家
  4. 5W1H系列 | Nacos 帮我们解决什么问题?(配置管理篇)
  5. 基于TableStore的亿级订单管理解决方案
  6. 重磅!中国网络空间安全协会发布《2020年中国网络安全产业统计报告》
  7. 一文读懂Docker及其对系统管理员的重要性
  8. 组装台式电脑配置清单_攒机必备!各种价位的台式电脑配置清单!
  9. php _trait,php Trait的使用
  10. JFrog Container Registry 搭建Docker镜像仓库 (tar.gz 版本)