算法原理请参考: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. SylixOS——虚拟机网络配置

    网络配置 点击设置按钮 新建虚拟网络适配器 输入IP地址(注意:IP地址必须和SylixOS在同一个子网内) 点击确定等待,虚拟网络适配器建立完成后效果如下(多了一个名为"以太网2" ...

  2. SpirngBoot 错误(1)

    对于出现该错: Error starting ApplicationContext. To display the conditions report re-run your application ...

  3. 多态——JavaSE基础

    多态 同一个方法可以根据对象的不同采取不同的动作 一个对象的实际类型是确定的,但可以指向对象的引用类型有很多 基本条件: 有继承关系 子类重写父类方法 父类引用指向子类对象Father f1 = ne ...

  4. PostgreSQL 13支持增量排序(Incremental Sorting)

    PostgreSQL 13支持增量排序(Incremental Sorting) PostgreSQL 13一个重要的功能是支持增量排序,使用order by 时可以加速排序,SQL如下 select ...

  5. Redis初启(一)

    1.数据库存存储性能优化 在mysql的文章专题中我写过了关于传统关系型数据库的一些优化思路,整体来说,通过优化之后能够提升程序访问数据库的计算性能.但是还是有一些情况,即便是优化之后,使用传统关系型 ...

  6. JS数组at函数(获取最后一个元素的方法)介绍

    本文介绍js中数组的at函数,属于比较简单的知识普及性文章,难度不大. 0x00 首先,我们可以思考如下一个问题,如果要获取一个数组的最后一个元素(这是很常用的操作),我们应该怎么做? 相信大部分人能 ...

  7. 表达式的动态解析和计算,Flee用起来真香

    前言 在很多项目中经常会出现需要动态解析表达式和计算的场景,比如一些自动审核规则,或者是一些变量的值通过维护的公式在运行过程中动态算出:由于场景需求,都需要比较灵活的配置对应的表达式,然后希望在需要的 ...

  8. 下载nltk数据包报错

    安装nltk需要两步:安装nltk和安装nltk_data数据包 安装nltk 安装nltk很简单,可以直接在pycharm环境中安装,flie -> settings-> Python ...

  9. javaweb_Http学习

    1. 什么是HTTP? HTTP(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上. 文本:html,字符串,~... 超文本:图片,音乐,视频,定位,地图..... 默认端口:80 ...

  10. 用WindowsAppSDK(WASDK)优雅的开发上位机应用

    C#开发上位机应用的一些选择 如果你不想看介绍,可以直接跳到优雅开发示例那里. 1. WASDK(WinUI 3) Windows 应用 SDK 是一组新的开发人员组件和工具,它们代表着 Window ...