神奇的魔方阵--(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 梯度下降 ...
随机推荐
- Ubuntu 下安装Anaconda + 显卡驱动 + CUDA + CUDNN + 离线安装环境
写来给自己备忘,并不是什么教程- .- 下载安装包 Anaconda:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 显卡驱动:https ...
- @media屏幕适应
/** 屏幕特殊处理 我们用min-width时,小的放上面大的在下面,同理如果是用max-width那么就是大的在上面,小的在下面 **/ @media screen and (max-width: ...
- Java基础语法:JavaDoc
一.简介 JavaDoc是一种将注释生成HTML文档的技术,它从程序源代码中抽取类.方法.成员等注释形成一个和源代码配套的API帮助文档. 也就是说,只要在编写程序时以一套特定的标签作注释,在程序编写 ...
- Python 基础学习笔记(超详细版)
1.变量 python中变量很简单,不需要指定数据类型,直接使用等号定义就好.python变量里面存的是内存地址,也就是这个值存在内存里面的哪个地方,如果再把这个变量赋值给另一个变量,新的变量通过之前 ...
- 第39天学习打卡(多线程 Thread Runnable 初始并发问题 Callable )
多线程详解 01线程简介 Process与Thread 程序:是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念. 进程则是执行程序的一次执行过程,它是一个动态的概念.是系统资源分配的 ...
- C#.NET操作数据库通用类
下面给出了一个C#操作MS SQL Server 数据库的通用类,通过该类可以对数据库进行任何操作,包括执行SQL语句.执行存储过程.以下是其详细实现过程,希望大家共同修改优化之.稍后将介绍如何使用它 ...
- 00.从0实现一个JVM语言系列
00.一个JVM语言的诞生 由于方才才获悉博客园文章默认不放在首页的, 原创文章主要通过随笔显示, 所以将文章迁移到随笔; 这篇帖子将后续更新, 欢迎关注! 这段时间要忙着春招实习, 所以项目更新会慢 ...
- ubuntu上pyecharts V1版本环境搭建
1 背景 今天想用pyecharts画图,在新的环境下使用pip安装之后发现,导入pyecharts模块一直失败,报错如下. 图 1 导入pyecharts错误图 请注意:我这里使用的python版本 ...
- springboot整合jsp,完成公交车站路线图
转: springboot整合jsp,完成公交车站路线图 点赞再看,养成习惯 开发环境: jdk 8 intellij idea tomcat 8 mysql 5.7 maven 3.6 所用技术: ...
- git仓库创建及基本使用
创建git用户 useradd git passwd git 创建目录 mkdir /home/git/repos/app.git/ -p 初始化目录 cd /home/git/repos/app.g ...