算法原理请参考:https://www.zhihu.com/question/23531676

先定义一些通用的函数,比如创建空幻方,删除幻方,打印幻方。

创建幻方

int **NewMagicS(int n) {
int **magic = new int*[n];
for (int k = 0; k < n; k++)
magic[k] = new int[n];
return magic;
}

删除幻方

void DeleteMagicS(int **magic, int n) {
for (int k = 0; k < n; k++)
delete[] magic[k];
delete[] magic;
}

打印幻方

void ShowMagicS(int **magic, int n) {
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++)
printf("%-6d", magic[i][j]);
printf("\n");
}
}

一、奇数幻方算法实现:

辅助函数(实现算法)

void OddMagicSA(int **magic, int n, int value) {
int i, j, total;
//初始化二维数组
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
magic[i][j] = 0;
i = 0;
j = n / 2;
magic[i][j] = value++;
for (total = 1; total < n*n; total++, value++) {//向右上角移动
//调整位置
if (!magic[(i - 1) == -1 ? n - 1 - i : i - 1][(j + 1) % n]) { //空闲
i = (i - 1) == -1 ? n - 1 - i : i - 1;
j = (j + 1) % n;
}
else //原位置下移一格(行变)
i = (i + 1) % n;
magic[i][j] = value;
}
}

主函数(负责打印)

void OddMagicS(int n) {
int **magic;
if (n <= 0 || n == 1 || n == 2 || (n % 2 == 0)) return;
magic = NewMagicS(n);
OddMagicSA(magic, n, 1);
//显示奇数幻方
ShowMagicS(magic, n);
DeleteMagicS(magic, n);
}

二、偶数幻方算法实现:

辅助函数(算法实现)

void EvenMagicSA(int **magic, int n, int value) {
int i, j;
//初始化二维数组
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
magic[i][j] = 0;
//分割为4x4格子,然后填充对角线位置为-1
for (i = 0; i < n; i += 4)//i, j 表示4x4起点
for (j = 0; j < n; j += 4) {
//对角线填充
for (int k = 0; k < 4; k++) {
magic[i + k][j + k] = -1;
magic[i + 3 - k][j + k] = -1;
}
}
i = 0;
for (; i < n; i++)
for (j = 0; j < n; j++, value++) {
//先填充4x4非对角线,从左向右,从上向下
if (magic[i][j] != -1 && magic[i][j] == 0) magic[i][j] = value;
//填充4x4对角线,左右向左,从下向上
if (magic[n - 1 - i][n - 1 - j] == -1) magic[n - 1 - i][n - 1 - j] = value;
}
}

主要函数(打印幻方)

void EvenMagicS(int n) {
int **magic;
if (n <= 0 || n == 1 || n == 2 || n % 4 != 0) return;
magic = NewMagicS(n);
EvenMagicSA(magic, n, 1);
//显示偶数幻方
ShowMagicS(magic, n);
DeleteMagicS(magic, n);
}

三、最后一个幻方类型叫做奇偶幻方,算法实现:

增加一个幻方复制

void CopyMagicS(int **dstMagic, int sLine, int sColumn, int **srcMagic, int n) {
for (int i = sLine, p = 0; p < n; i++, p++)
for (int j = sColumn, q = 0; q < n; j++, q++)
dstMagic[i][j] = srcMagic[p][q];
}

主要函数(算法实现)

void OddEvenMagicS(int n) {
int **magic, **magicTemp, i, j, k, mid;
if (!(n >= 0 && n != 1 && n != 2 && (n % 2 == 0 && n % 4 != 0))) return;
magic = NewMagicS(n);
magicTemp = NewMagicS(n / 2);
//顺时针分成A,B,C,D四个象限,并且按照A, D, B, C的顺序以奇幻方方法填充
i = j = 0;//A象限
OddMagicSA(magicTemp, n / 2, 1);
CopyMagicS(magic, i, j, magicTemp, n / 2);
i = j = n / 2;//D象限
OddMagicSA(magicTemp, n / 2, n / 2 * n / 2 + 1);
CopyMagicS(magic, i, j, magicTemp, n / 2);
i = 0;
j = n / 2;//B象限
OddMagicSA(magicTemp, n / 2, n / 2 * n / 2 * 2 + 1);
CopyMagicS(magic, i, j, magicTemp, n / 2);
i = n / 2;
j = 0;//C象限
OddMagicSA(magicTemp, n / 2, n / 2 * n / 2 * 3 + 1);
CopyMagicS(magic, i, j, magicTemp, n / 2);
k = (n - 2) / 4;
//A, C象限交换
for (int l = 0; l < n / 2; l++)
for (int m = 0; m < k; m++)
if (l == n / 4) {//中间行
mid = magic[l][k + m];
magic[l][k + m] = magic[n / 2 + l][k + m];
magic[n / 2 + l][k + m] = mid;
}
else {
mid = magic[l][m];
magic[l][m] = magic[n / 2 + l][m];
magic[n / 2 + l][m] = mid;
}
//B, D象限交换
for (int l = 0; l < k - 1; l++) {//列
for (int m = 0; m < n / 2; m++) {//行
mid = magic[m][3 * n / 4 - l];
magic[m][3 * n / 4 - l] = magic[n / 2 + m][3 * n / 4 - l];
magic[n / 2 + m][3 * n / 4 - l] = mid;
}
}
//显示奇偶数幻方
ShowMagicS(magic, n);
DeleteMagicS(magic, n);
DeleteMagicS(magicTemp, n / 2);
}

所有代码均经过测试,结果正确。

任意N阶幻方算法实现的更多相关文章

  1. Java 实现任意N阶幻方的构造

    一.关于单偶数阶幻方和双偶数阶幻方 (一)单偶数阶幻方(即当n=4k+2时) 任何4k+2 阶幻方都可由2k+1阶幻方与2×2方块复合而成,6是此类型的最小阶. 以6阶为例,可由3阶幻方与由0,1,2 ...

  2. 任意阶幻方(魔方矩阵)C语言实现

    魔方又称幻方.纵横图.九宫图,最早记录于我国古代的洛书.据说夏禹治水时,河南洛阳附近的大河里浮出了一只乌龟,背上有一个很奇怪的图形,古人认为是一种祥瑞,预示着洪水将被夏禹王彻底制服.后人称之为&quo ...

  3. Java 实现奇数阶幻方的构造

    一.设计的流程图如下所示 二.Java 语言的代码实现 package MagicSquare; //奇数幻方的实现 public class Magic_Odd { //n 为幻方的阶数 publi ...

  4. n阶幻方

    前序 最近在学习一些经典的算法,搞得头昏脑涨,就想换换脑子.在家里的旧书堆里面乱翻,无意中将一本具有十多年历史的小学数学奥林匹克竞赛的书发掘了出来,能放到现在挺不容易的,就拿起来随便翻翻.看了看目录, ...

  5. n阶幻方问题

    转载自:http://blog.csdn.net/fengchaokobe/article/details/7437767 目录        第一节 n阶幻方问题       第二节 由n阶幻方引发 ...

  6. 【C】——幻方算法

    一.幻方按照阶数可分成了三类,即奇数阶幻方.双偶阶幻方.单偶阶幻方. 二.奇数阶幻方(劳伯法) 奇数阶幻方最经典的填法是罗伯法.填写的方法是: 把1(或最小的数)放在第一行正中:按以下规律排列剩下的( ...

  7. hdu1998 bjfu1272奇数阶幻方构造

    这题就是一个sb题,本来很水,硬是说得很含混.奇数阶幻方构造其实有好多方法,这题既不special judge,也不说清楚,以为这样能把水题变成难题似的,简直想骂出题人. /* * Author : ...

  8. Codeforces 710C. Magic Odd Square n阶幻方

    C. Magic Odd Square time limit per test:1 second memory limit per test:256 megabytes input:standard ...

  9. codeforces 710C Magic Odd Square(构造或者n阶幻方)

    Find an n × n matrix with different numbers from 1 to n2, so the sum in each row, column and both ma ...

随机推荐

  1. 【系统】Windows相关软件下载

    Windows相关软件下载 Visual Studio Windows SQL Server https://my.visualstudio.com/Downloads/Featured?mkt=zh ...

  2. Meaven静态资源过滤

    ` 点击查看代码 <build> <resources> <resource> <directory>src/main/java</directo ...

  3. Redis(1)- Redis数据库的安装和配置

    1.Redis安装 1.1.Linux环境安装Redis step-1:下载Redis 进入官网找到下载地址 https://redis.io/download wget https://github ...

  4. 动态调试JS脚本文件:(JS源映射 - sourceURL)与 debugger

    我们在进行js调试时经常会对js进行调试,chrome 对js提示对支持非常友好,只需要F12就可以打开chrome的调试器 在sources里面就是页面请求后加载的一些资源文件,我们可以找到我们的j ...

  5. 降维、特征提取与流形学习--非负矩阵分解(NMF)

    非负矩阵分解(NMF)是一种无监督学习算法,目的在于提取有用的特征(可以识别出组合成数据的原始分量),也可以用于降维,通常不用于对数据进行重建或者编码. NMF将每个数据点写成一些分量的加权求和(与P ...

  6. STM32启动文件

    一.复位电路 在了解启动文件之前需要明白STM32的复位中断流程,STM32的复位分为上电复位和手动复位,复位的电路图如下所示: 注意: 图中的复位电路是低电平复位,有的MCU是高电平复位. 上电复位 ...

  7. LC T668笔记 & 有关二分查找、第K小数、BFPRT算法

    LC T668笔记 [涉及知识:二分查找.第K小数.BFPRT算法] [以下内容仅为本人在做题学习中的所感所想,本人水平有限目前尚处学习阶段,如有错误及不妥之处还请各位大佬指正,请谅解,谢谢!] !! ...

  8. 前端3JS1

    内容概要 溢出属性 定位属性 z-index JavaScript简介 变量与注释 数据类型 内容详情 溢出属性 # 文本内容超出了标签的最大范围 overflow: hidden; 接隐藏文本内容 ...

  9. 【zigbee无线通信模块步步详解】ZigBee3.0模块建立远程网络控制方法

    本文以路灯控制应用为例,简述ZigBee3.0模块使用流程. 一.建立网络 1.通过USB转串口模块将出厂的ZigBee自组网模块连接,打开上位机软件"E180-ZG120A-Setting ...

  10. Nginx下fastcgi_split_path_info导致CodeIgniter配置问题

    Nginx下fastcgi_split_path_info导致CodeIgniter配置问题   突然发最近又有点懒散了,很久没有写东西了!今天谈点关于不是什么很新的问题,在nginx下配置ci框架时 ...