算法原理请参考: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. 817. Linked List Components - LeetCode

    Question 817. Linked List Components Solution 题目大意:给一个链表和该链表元素组成的一个子数组,求子数组在链表中组成多少个片段,每个片段中可有多个连续的元 ...

  2. MyBatisPlus详解

    1.MyBatisPlus概述 需要的基础:MyBatis.Spring.SpringMVC 为什么要学习?MyBatisPlus可以节省我们大量工作时间,所有的CRUD代码它都可以自动化完成! 简介 ...

  3. Hadoop安装学习(第二天)

    学习任务: 1.对VMnet8进行设置 2.配置主机名,对host文件进行编辑 3.将Hadoop文件以及jdk通过Xshell7传输到Linux系统 4.设置免密登录

  4. MongoDB 安全认证

    每日一句 Sometimes your whole life boils down to one insane move. 人一生中出人头地的机会不多,一旦有了一定要抓住! 概述 默认情况下,Mong ...

  5. 聚类--DBSCN

    1.什么是DBSCN DBSCAN也是一个非常有用的聚类算法. 它的主要优点:它不需要用户先验地设置簇的个数,可以划分具有复杂形状的簇,还可以找出不属于任何簇的点. DBSCAN比凝聚聚类和k均值稍慢 ...

  6. 记一次生产事故的排查与优化——Java服务假死

    一.现象 在服务器上通过curl命令调用一个Java服务的查询接口,半天没有任何响应.关于该服务的基本功能如下: 1.该服务是一个后台刷新指示器的服务,即该服务会将用户需要的指示器数据提前计算好,放入 ...

  7. 【Unity Shader】syntax error: unexpected token 'struct' at line x 错误解决办法

    以下代码处出现了syntax error: unexpected token 'struct' at line 33的错误 struct a2v { float4 vertex_position : ...

  8. SpringBoot Restful 接口实现

    目录 SpringBoot 核心注解 SpringBoot Restful 接口实现 封装响应数据 SpringBoot 核心注解 SpringBoot 基础入门 注解 说明 Component 声明 ...

  9. GitHub 简介

    用详细的图文对GitHub进行简单的介绍. git是一个版本控制工具,github是一个用git做版本控制的项目托管平台. 主页介绍: overview:总览.相当于个人主页. repositorie ...

  10. Docker容器固定ip

    Docker容器固定IP 必须停止docker服务才能创建网桥 查看docker服务状态 停止docker服务 启动docker服务 [root@docker Tools]# systemctl st ...