神奇的魔方阵--(MagicSquare)(2)
在上一篇博客中,我们讨论了阶数为奇数,以及阶数为(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. 以奇数阶魔方阵的方法连续填制法依左上、右下、右上、左下的顺序分别填制这四个小方阵。
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)的更多相关文章
- 神奇的魔方阵--(MagicSquare)(1)
本篇文章只对奇数阶以及偶数阶中阶数n = 4K的魔方阵进行讨论.下面就让我们进入正题: 1 :魔方阵的相关信息:(百度百科) https://baike.baidu.com/item/%E9%AD%9 ...
- 任意阶魔方阵(幻方)的算法及C语言实现
写于2012.10: 本来这是谭浩强那本<C程序设计(第四版)>的一道课后习题,刚开始做得时候去网上找最优的算法,结果发现奇数和双偶数(4的倍数)的情况下算法都比较简单,但是单偶数(2的倍 ...
- 魔方阵算法及C语言实现
1 魔方阵概念 填充的,每一行.每一列.对角线之和均相等的方阵,阶数n = 3,4,5….魔方阵也称为幻方阵. 例如三阶魔方阵为: 魔方阵有什么的规律呢? 魔方阵分为奇幻方和偶幻方.而偶幻方又分为是4 ...
- C语言——打印魔方阵(每一行,每一列,对角线之和相等)
<一>魔方阵说明: 魔方阵是一个N*N的矩阵: 该矩阵每一行,每一列,对角线之和都相等: <二>魔方阵示例: 三阶魔方阵: 8 1 6 3 5 7 4 9 ...
- 【2(2N+1)魔方阵 】
/* 2(2N+1)魔方阵 */ #include<stdio.h> #include<stdlib.h> #define N 6 #define SWAP(x, y) {in ...
- n阶魔方阵(奇数阵)的输出
需求 要求输出1~n²的自然数构成的魔方阵. STEP 1 什么是魔方阵? 魔方阵,古代又称“纵横图”,是指组成元素为自然数1.2…n2的平方的n×n的方阵,其中每个元素值都不相等,且每行.每列以及主 ...
- 算法:九宫格问题--奇数阶魔方(Magic-Square)
一.魔方介绍 魔方(这里是简称,也可以叫幻方.魔术矩阵,Magic Square)是 n×n 正方形网格(n 为每侧的单元数),里面每个单元格填充了不同的正整数 1, 2, 3, ... , n2,并 ...
- Octave入门
Octave/Matlab Tutorial Octave/Matlab Tutorial Basic Operations 你现在已经掌握不少机器学习知识了 在这段视频中 我将教你一种编程语言 Oc ...
- 吴恩达-coursera-机器学习-week2
四.多变量线性回归(Linear Regression with Multiple Variables) 4.1 多维特征 4.2 多变量梯度下降 4.3 梯度下降法实践1-特征缩放 4.4 梯度下降 ...
随机推荐
- c#初体验
虚方法.抽象类.接口区别:虚方法:父类可能需要实例化,父类方法需要方法体,可以找到一个父类 抽象类:抽象方法,父类不能实例化,且父类方法不能实现方法体,不可以找出一个父类,需要抽象 接口:多继承 le ...
- 深入剖析 ConcurrentHashMap
自建博客地址:https://bytelife.net,欢迎访问! 本文为博客自动同步文章,为了更好的阅读体验,建议您移步至我的博客 本文作者: Jeffrey 本文链接: https://bytel ...
- Redis集群简介及部署
1简介 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...
- Flannel和Calico网络插件工作流程对比
Flannel和Calico网络插件对比 Calico简介 Calico是一个纯三层的网络插件,calico的bgp模式类似于flannel的host-gw Calico方便集成 OpenStac ...
- linux 安装软件步骤
1,下载wget http://www.erlang.org/download/otp_src_R16B02.tar.gz2,解压 tar -zxvf otp_src_R16B02.tar.gz3,编 ...
- 【开源】.net微服务开发引擎Anno 让复杂的事简单点- 日志、链路追踪一目了然 (上)
1.Anno简介? Anno是一个微服务框架引擎.入门简单.安全.稳定.高可用.全平台可视化监控.依赖第三方框架少.详情请查看<[开源].net微服务开发引擎Anno开源啦> 本章主题:. ...
- Linux基本命令——系统管理和磁盘管理
转: Linux基本命令--系统管理和磁盘管理 Linux命令--系统管理和磁盘管理 一.系统管理 1.1 时间相关指令 <1> 查看当前日历: cal <2> 显示或设置时间 ...
- pytorch(10)transform模块(进阶)
图像变换 Pad 对图片边缘进行填充 transforms.Pad(padding,fill=0,padding_mode='constant') padding:设置填充大小,(a,b,c,d)左上 ...
- windows下MySQL如何完全卸载并安装行的版本
卸载本地mysql之前,请务必要先将需要的数据库备份 停止mysql 服务 windows键-->搜索服务 找到mysql 服务,并停止他 卸载mysql server 在控制面板--程序 找到 ...
- Java概述与准备
Java概述 Java语言背景介绍 Java之父:詹姆斯·高斯林(James Gosling) java语言的三个版本: JavaSE: Java 语言的(标准版),用于桌面应用的开发,是其他两个 ...