神奇的魔方阵--(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 梯度下降 ...
随机推荐
- npm与package.json快速入门
本文转载自npm与package.json快速入门 导语 npm 是前端开发广泛使用的包管理工具,之前使用 Weex 时看了阮一峰前辈的文章了解了一些,这次结合官方文章总结一下,加深下理解吧! 读完本 ...
- mysql 8.0.18 小白安装教程
1. 下载 官网下载:https://dev.mysql.com/downloads/mysql/ 嫌官网网速慢可以加q群,在群文件里下载: 1.下载第一个download 2.解压在自己建的目录(各 ...
- AForge实现拍照
记得先引用DLL private FilterInfoCollection videoDevices; private VideoCaptureDevice videoSource; BLL.AWBL ...
- DRF的orm多表关系补充及serializer子序列化
目录 一.控制多表关系的字段属性 1.如何建立基表 2.断开连表关系 3.四种级联关系 二.子序列化 一.控制多表关系的字段属性 1.如何建立基表 要在基表中配置Meta,设置abstract=Tru ...
- E: Some index files failed to download. They have been**
转: E: Some index files failed to download. They have been** 问题描述: 当使用Dockerfile从包含cuda的镜像建立新的image的时 ...
- Synchronized 轻量级锁会自旋?好像并不是这样的。
本来是在写面霸系列的,写着写着就写到了这一题: Synchronized 原理知道不? 而关于 Synchronized 我去年还专门翻阅 JVM HotSpot 1.8 的源码来研究了一波,那时候我 ...
- 设计模式之简单工厂模式(Simple Factory Pattern)
一.简单工厂模式的由来 所有设计模式都是为解决某类问题而产生的,那么简单工厂模式是为解决什么问题呢?我们假设有以下业务场景: 在一个学生选课系统中,文科生用户选课时,我们要获得文科生的所有课程列表:理 ...
- WPF 基础 - 资源
为了避免丢失和损坏,编译器允许我们把外部文件编译进程序主体.成为程序主体不可分割的一部分,这就是传统意义上的程序资源,即二进制资源: WPF 的四个等级资源: 数据库里的数据 (仓库) 资源文件 (行 ...
- redhat配置问题
redhat开机自动连接网络配置 vim /etc/sysconfig/network-scripts/ifcfg-eth0 将 ONBOOT=no 更改为 yes 即可 redhat配置 yum ...
- 【Azure 微服务】PowerShell中,用Connect-ServiceFabricCluster命令无法连接到sf-test.chinaeast2.cloudapp.chinacloudapi.cn:19000 问题分析
问题描述 Azure Service Fabric提供了PowerShell的指令来进行创建,管理资源,如Get-ServiceFabricClusterHealth 获取当前集群的健康状态,但这些命 ...