在上一篇博客中,我们讨论了阶数为奇数,以及阶数为(4K)的魔方阵的排列规则,以及代码实现(详见:https://www.cnblogs.com/1651472192-wz/p/14640903.html);

本篇文章则对最后一种情况: 阶数n = 4K + 2 的魔方阵 排列规律 进行分析, 以及代码实现.让我们直接进入正题:

 1. 偶数阶魔方阵(n = 4*K + 2)

  1.排列规律:(源自百度百科):

         1. 先将整个方阵划成田字型的四个2 k + 1阶的奇数阶小方阵

2. 右半两个小方阵中大于k+2的列;

3. 左半两个小方阵中( k + 1 , k + 1 )的格位;

4. 左半两个小方阵中除了( k+1 , 1 )是指第一列第k+1行的格位之外,小于k +1的列。

5. 以奇数阶魔方阵的方法连续填制法依左上、右下、右上、左下的顺序分别填制这四个小方阵。

         6. 将上半及下半方阵中有注记的数字对调,魔方阵完成。
 
  2. 规律解读:
   我们可以将排列规律分成两个部分,
   1. 分块,并对所分的块儿 按照 左上、右下、右上、左下的顺序分别以奇数魔方阵的摆放规则进行摆放(注意 : 在填写时要接上上个魔方阵的最后一个数字开始填起),
   2. 对魔方阵的特殊位置进行标记 ,在最后对上下对称的标记的位置的数字进行对调.
 
  3. 图示:(在这里以6阶魔方阵为例)

   1.分块:

  

  2. 按照 左上、右下、右上、左下的顺序分别以奇数魔方阵的摆放规则进行摆放 , 同时标记:

   

  3.对标记的方块进行对调,魔方阵完成:

  

  4.代码实现:

  根据上面的分析,代码主要分为两部分 1. 分块填数, 2. 交换

  代码如下:(软件:VS2019)

#include<assert.h>
#include<stdio.h>


void Print(int(*ar)[6], int row, int col)//打印
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf("%3d", ar[i][j]);
}
printf("\n");
}
} //传入 奇数阶小魔方阵起始的行列信息,以及小魔方阵的大小,起始的数字
void Magic_Square_1(int (*ar)[6],int row, int col, int size, int num)
{
assert(ar != nullptr && row >= 0 && col >= 0);
ar[row][size / 2 + col] = num;//注意第一个数摆在魔方阵第row行中间的位置
// 在这里不能取col/2,要取 size/2 + col;
int preRow = row;//记录上一个数字的行对于[row][col] 的偏移量 信息
int preCol = size / 2 + col; for (int i = num +1; i < num + size * size; i++)
{
//重点:
//注意在这里行列下标都需要加上传入的row 和 col 即在这里的preRow 和 preCol 记录的是相对与
//坐标[row][col]的偏移量.
if (ar[row + (preRow - 1 + size) % size][col + (preCol + 1) % size] == 0)
{
ar[row + (preRow - 1 + size) % size][col + (preCol + 1) % size] = i ;
preRow = (preRow - 1 + size) % size;
preCol = (preCol + 1) % size;
}
else
{
ar[row + (preRow + 1) % size][col + preCol] = i;
preRow = (preRow + 1) % size;
}
}
} void Swap(int* pa, int* pb)
{
int tmp = *pa;
*pa = *pb;
*pb = tmp;
} void Magic_Square()
{
#define ROW 6
#define COL ROW
int ar[ROW][COL] = {};
Magic_Square_1(ar, 0, 0, ROW / 2, 1);//左上
Magic_Square_1(ar, ROW/2, COL/2, ROW / 2, 1+(ROW*COL/4));//右下
Magic_Square_1(ar, 0, COL/2, ROW / 2, 1+ (ROW * COL / 2));//右上
Magic_Square_1(ar, ROW/2, 0, ROW / 2, 1+ (ROW * COL / 4)*3);//左下 //上下对调右半两个小方阵中大于k+2的列;
for (int i = 0; i < ROW/2; i++)
{
for (int j = 0; j < COL; j++)
{
//上下对调右半两个小方阵中大于k+2的列;
if (j > ((ROW - 2) / 4 + ROW/2 + 2)) // 此处 注意需要加上 ROW/2
{
Swap(&ar[i][j], &ar[i + ROW / 2][j]);
} //左半两个小方阵中除了( k+1 , 1 )是指第一列第k+1行的格位之外,小于k +1的列。
if(j < ((ROW - 2) / 4 ) ) //此处注意在程序中,下标是从零开始的,所以不需要加1 即:if(j < ((ROW - 2) / 4 + 1)) 这样是错误的
{
if (j != 1 && i != ((ROW - 2) / 4 ))//同上不需要加一
{
Swap(&ar[i][j], &ar[i + ROW / 2][j]);
}
}
}
} //左半两个小方阵中( k + 1 , k + 1 )的格位;
Swap(&ar[ROW / 4][COL / 4], &ar[ROW / 4 + ROW / 2][COL / 4]);
Print(ar, ROW, COL); #undef ROW
#undef COL } int main()
{
Magic_Square();
return 0;
}

运行结果:

(若有大哥发现其中的不合适或者错误,请务必在评论中告知,小弟在这里祝大哥心情愉悦,生活快乐!)

本篇完.

神奇的魔方阵--(MagicSquare)(2)的更多相关文章

  1. 神奇的魔方阵--(MagicSquare)(1)

    本篇文章只对奇数阶以及偶数阶中阶数n = 4K的魔方阵进行讨论.下面就让我们进入正题: 1 :魔方阵的相关信息:(百度百科) https://baike.baidu.com/item/%E9%AD%9 ...

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

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

  3. 魔方阵算法及C语言实现

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

  4. C语言——打印魔方阵(每一行,每一列,对角线之和相等)

    <一>魔方阵说明: 魔方阵是一个N*N的矩阵: 该矩阵每一行,每一列,对角线之和都相等: <二>魔方阵示例: 三阶魔方阵: 8   1   6 3   5   7 4   9 ...

  5. 【2(2N+1)魔方阵 】

    /* 2(2N+1)魔方阵 */ #include<stdio.h> #include<stdlib.h> #define N 6 #define SWAP(x, y) {in ...

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

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

  7. 算法:九宫格问题--奇数阶魔方(Magic-Square)

    一.魔方介绍 魔方(这里是简称,也可以叫幻方.魔术矩阵,Magic Square)是 n×n 正方形网格(n 为每侧的单元数),里面每个单元格填充了不同的正整数 1, 2, 3, ... , n2,并 ...

  8. Octave入门

    Octave/Matlab Tutorial Octave/Matlab Tutorial Basic Operations 你现在已经掌握不少机器学习知识了 在这段视频中 我将教你一种编程语言 Oc ...

  9. 吴恩达-coursera-机器学习-week2

    四.多变量线性回归(Linear Regression with Multiple Variables) 4.1 多维特征 4.2 多变量梯度下降 4.3 梯度下降法实践1-特征缩放 4.4 梯度下降 ...

随机推荐

  1. java荷兰国旗问题

    荷兰国旗包含三种颜色:红.白.蓝. 有三种颜色的球,算法的目标是将这三种球按颜色顺序正确地排列.它其实是三向切分快速排序的一种变种,在三向切分快速排序中,每次切分都将数组分成三个区间:小于切分元素.等 ...

  2. Elasticsearch---DSL搜索实践

    Domain Specific Language 特定领域语言,基于JSON格式的数据查询,查询更灵活,有利于复杂查询 一.普通url路径参数搜索 数据准备 1.建立名字为 shop 的索引 2.手动 ...

  3. 力扣1052. 爱生气的书店老板-C语言实现-中等难度

    题目 传送门 文本 今天,书店老板有一家店打算试营业 customers.length 分钟.每分钟都有一些顾客(customers[i])会进入书店,所有这些顾客都会在那一分钟结束后离开. 在某些时 ...

  4. 死磕Spring之IoC篇 - 文章导读

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...

  5. 使用Mongodb设计评论系统

    1:如何设计数据存储结构 1.1:mysql 1:评论表 2:回复表(评论的评论) 1.2:mongodb 不需要两张表,一个collection 就可以搞定. 数据结构如图: 通过对象数组中的字段作 ...

  6. LDAP启动TLS 完整操作流程

    配置LDAP启动TLS 阅读本文之前,建议初学的小伙伴先看一下上一篇:完整的 LDAP + phpLDAPadmin安装部署流程 (ubuntu18.04) 以下正文: 接下来的操作承接上文,还是在同 ...

  7. 学习java之电脑的常用快捷键和DOS窗口下的常用命令

    学习java之电脑的常用快捷键和DOS窗口下的常用命令 电脑一些常用的快捷键 win快捷键: 单独按Windows:显示或隐藏 "开始"功能表 Windows+BREAK:显示&q ...

  8. 剑指 Offer 31. 栈的压入、弹出序列 + 入栈顺序和出栈顺序的匹配问题

    剑指 Offer 31. 栈的压入.弹出序列 Offer_31 题目详情: 解析: 这里需要使用一个栈来模仿入栈操作. package com.walegarrett.offer; /** * @Au ...

  9. webstorm2020.3安装破解教程

    免责声明:本教程及相关附件仅限于学术交流,不能用于商业以及违法用途,请于下载后24小时内删除!如产生法律纠纷,一切与本人无关,呼吁各位小伙伴支持下正版软件.本文如有侵权,请联系小编删除之. 该操作是用 ...

  10. IntelliJ-IDEA 打包代码报错

    一.问题由来 使用 IntelliJ-IDEA 打包项目一直以来都没问题,可是上周的时候,突然打包就报错了,并且Maven中的pom.xml文件确定是没有改过,打包的配置文件也没有修改过. 报错信息如 ...