神奇的魔方阵--(MagicSquare)(1)
本篇文章只对奇数阶以及偶数阶中阶数n = 4K的魔方阵进行讨论.下面就让我们进入正题:
1 :魔方阵的相关信息:(百度百科)
https://baike.baidu.com/item/%E9%AD%94%E6%96%B9%E9%98%B5/10973743?fr=aladdin
2 :奇数阶和偶数阶魔方阵的排列规律.(源自百度百科) (可跳至第三部分)
,
,#include<assert.h>
#include<stdio.h>
void Magic_Square_1()
{
#define ROW 3
#define COL ROW // 等价于 #define COL 3
assert(ROW % 2 != 0);
if (ROW % 2 == 0)//ROW & ! == 1 判断是否为奇数 &(只有全为1,才为1)
{
return;
}
int preRow = 0; //记录上一个数的行坐标
int preCol = 0; //记录上一个数的列坐标
int ar[ROW][COL] = {};
ar[0][COL / 2] = 1; //先放1
preRow = 0;
preCol = COL / 2;
for (int i = 2; i <= ROW * COL; i++)//1已经放入所以从2开始进行
{
if (ar[(preRow - 1 + ROW) % ROW][(preCol + 1) % COL] == 0)
//判断上一个数的上一行下一列是否有值若没有则放入当前的i
{
preRow = (preRow - 1 + ROW) % ROW;
preCol = (preCol + 1) % COL;
}
else
{ // 若有则i放在上一个数的下一行.
preRow = (preRow + 1) % ROW;
}
ar[preRow][preCol] = i;
}
for (int i = 0; i < ROW; i++)//打印
{
for (int j = 0; j < COL; j++)
{
printf("%3d", ar[i][j]);
}
printf("\n");
}
#undef ROW //取消定义
#undef COL
}
int main()
{
Maagic_Square_1();
return 0;
}
运行结果:


3.2.2) : 将取出来的值按照从大到小的顺序(或从小到大的顺序)排好,从二维数组的[0][0]下标开始(从二维数组[ROW - 1][COL - 1]的位置开始) 依次填入到数组中空白的位置.
(重点)排列n= 4*k 阶的魔方阵的关键是取出各个四阶魔方阵的对角线的元素.我们可以发现:所有在对角线的元素的行列下标只差都满足一定的规律:
即 |row - col|(绝对值) % 4 == 0 (对应图中黄色部分)或者(row + col)%4 == 3(对应图中红色部分) .同时我们可以定义一个数组br[ROW*ROW/2],
在第一步填入数据时对其行列下标进行判断,若满足对角线元素下标的特点,直接将数值存放到br中,同时对二维数组相应的位置赋零值.
这样br 中的数就是从小到大排列的,只需要在第二步时从二维数组ar 的ar[ROW - 1][COL - 1]的位置开始,
依次将数组br中的值填入到数组中空白的位置.

代码如下:
#include<stdio.h>
#include<assert.h>
void Magic_Square_4K()
{
#define ROW 8
#define COL ROW
int ar[ROW][COL] = {};
int br[ROW*ROW/2] = {};//用来存储4阶方阵对角线元素.
int num = 1;//从1开始填入
int k = 0;//数组br下标.
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
if((i-j)%4==3||(i-j)%4==0|| (j - i) % 4 == 3 || (j - i) % 4 == 0)
{//先控制对角线元素为零,并将应该填在对角线的这些数记录到br中.
br[k] = num;
k += 1;
ar[i][j] = 0;
}
else
{
ar[i][j] = num;
}
num++;
}
}
int tag = 0;
for (int i = ROW - 1; i >= 0; i--)//将br中的数按照顺序,从ar[ROW-1][COl-1]开始对ar中为零的元素赋值.
{
for (int j = COL - 1; j >= 0; j--)
{
if (ar[i][j] == 0)
{
ar[i][j] = br[tag];
tag += 1;
}
}
} for (int i = 0; i < ROW; i++)//打印
{
for (int j = 0; j < COL; j++)
{
printf("%4d", ar[i][j]);
}
printf("\n");
}
#undef ROW
#undef COL
}
int main()
{
Magic_Square_4K();
return 0;
}
运行结果:

未完待续...
神奇的魔方阵--(MagicSquare)(1)的更多相关文章
- 神奇的魔方阵--(MagicSquare)(2)
在上一篇博客中,我们讨论了阶数为奇数,以及阶数为(4K)的魔方阵的排列规则,以及代码实现(详见:https://www.cnblogs.com/1651472192-wz/p/14640903.htm ...
- 任意阶魔方阵(幻方)的算法及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 梯度下降 ...
随机推荐
- py 时间处理
字符串解析 如果你使用的不是isoformat string那么解析字符串就会失败,需要用strptime转换一下 import datetime datetime.datetime.strptime ...
- 让 gRPC 提供 REST 服务
让 gRPC 提供 REST 服务 Intro gRPC 是一个高性能.开源和通用的 RPC 框架,面向移动和 HTTP/2 设计. gRPC 基于 HTTP/2 标准设计,带来诸如双向流.流控.头部 ...
- 【从零开始撸一个App】Fragment和导航中的使用
Fragment简介 Fragment自从Android 3.0引入开始,它所承担的角色就是显而易见的.它之于Activity就如html片段之于页面,好处无需赘述. Fragment的生命周期和Ac ...
- Java如何保证文件落盘?
本文转载自Java如何保证文件落盘? 导语 在之前的文章Linux/UNIX编程如何保证文件落盘中,我们聊了从应用到操作系统,我们要如何保证文件落盘,来确保掉电等故障不会导致数据丢失.JDK也封装了对 ...
- nginx反向代理理解
实际开发中,会有不同的环境: - 开发环境:自己的电脑- 测试环境:提供给测试人员使用的环境- 预发布环境:数据是和生成环境的数据一致,运行最新的项目代码进去测试- 生产环境:项目最终发布上线的环境 ...
- java实现压缩文件
原文链接:https://www.cnblogs.com/zeng1994/p/7862288.html
- mysql导入备份.sql文件时报错总结(还有待完善)
错误1:ERROR Unknown character set: 'utf8mb4' utf8mb4编码集支持了表情符号,相信处理过社交网络数据的人都有了解.这个mysql5.5以后支持了utf8mb ...
- Asp.NET Core 限流控制-AspNetCoreRateLimit
起因: 近期项目中,提供了一些调用频率较高的api接口,需要保障服务器的稳定运行:需要对提供的接口进行限流控制.避免因客户端频繁的请求导致服务器的压力. 一.AspNetCoreRateLimit 介 ...
- wxWidgets源码分析(5) - 窗口管理
窗口管理 所有的窗口均继承自wxTopLevelWindows: WXDLLIMPEXP_DATA_CORE(wxWindowList) wxTopLevelWindows; wxTopLevelWi ...
- AVR单片机教程——第三期导语
背景(一) 寒假里做了一个灯带控制器: 理想情况下我应该在一个星期内完成这个项目,但实际上它耗费了我几乎一整个寒假,因为涉及到很多未曾尝试的方案.在这种不是很赶时间的.可以自定目标.自由发挥的项目中, ...