任意N阶幻方算法实现
算法原理请参考: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阶幻方算法实现的更多相关文章
- Java 实现任意N阶幻方的构造
一.关于单偶数阶幻方和双偶数阶幻方 (一)单偶数阶幻方(即当n=4k+2时) 任何4k+2 阶幻方都可由2k+1阶幻方与2×2方块复合而成,6是此类型的最小阶. 以6阶为例,可由3阶幻方与由0,1,2 ...
- 任意阶幻方(魔方矩阵)C语言实现
魔方又称幻方.纵横图.九宫图,最早记录于我国古代的洛书.据说夏禹治水时,河南洛阳附近的大河里浮出了一只乌龟,背上有一个很奇怪的图形,古人认为是一种祥瑞,预示着洪水将被夏禹王彻底制服.后人称之为&quo ...
- Java 实现奇数阶幻方的构造
一.设计的流程图如下所示 二.Java 语言的代码实现 package MagicSquare; //奇数幻方的实现 public class Magic_Odd { //n 为幻方的阶数 publi ...
- n阶幻方
前序 最近在学习一些经典的算法,搞得头昏脑涨,就想换换脑子.在家里的旧书堆里面乱翻,无意中将一本具有十多年历史的小学数学奥林匹克竞赛的书发掘了出来,能放到现在挺不容易的,就拿起来随便翻翻.看了看目录, ...
- n阶幻方问题
转载自:http://blog.csdn.net/fengchaokobe/article/details/7437767 目录 第一节 n阶幻方问题 第二节 由n阶幻方引发 ...
- 【C】——幻方算法
一.幻方按照阶数可分成了三类,即奇数阶幻方.双偶阶幻方.单偶阶幻方. 二.奇数阶幻方(劳伯法) 奇数阶幻方最经典的填法是罗伯法.填写的方法是: 把1(或最小的数)放在第一行正中:按以下规律排列剩下的( ...
- hdu1998 bjfu1272奇数阶幻方构造
这题就是一个sb题,本来很水,硬是说得很含混.奇数阶幻方构造其实有好多方法,这题既不special judge,也不说清楚,以为这样能把水题变成难题似的,简直想骂出题人. /* * Author : ...
- Codeforces 710C. Magic Odd Square n阶幻方
C. Magic Odd Square time limit per test:1 second memory limit per test:256 megabytes input:standard ...
- 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 ...
随机推荐
- 821. Shortest Distance to a Character - LeetCode
Question 821. Shortest Distance to a Character Solution 思路:遍历字符串S,遇到与字符C相等就分别向左/右计算其他字符与该字符的距离,如果其他字 ...
- 第06组 Beta冲刺 (5/5)
目录 1.1 基本情况 1.2 冲刺概况汇报 1.郝雷明 2. 方梓涵 3.曾丽莉 4.黄少丹 5. 董翔云 6.鲍凌函 7.杜筱 8.詹鑫冰 9.曹兰英 10.吴沅静 1.3 冲刺成果展示 1.1 ...
- 基于云服务MRS构建DolphinScheduler2调度系统
摘要:本文介绍如何搭建DolphinScheduler并运行MRS作业. 本文分享自华为云社区<基于云服务MRS构建DolphinScheduler2调度系统>,作者: 啊喔YeYe . ...
- 关于『进击的Markdown』:第五弹
关于『进击的Markdown』:第五弹 建议缩放90%食用 路漫漫其修远兮,吾将上下而求索. 我们要接受Mermaid的考验了呢 Markdown 语法真香(一如既往地安利) ( 进击吧!Mark ...
- 如何在 Mac 和虚拟机上安装 macOS Big Sur、Monterey 和 Ventura
请访问原文链接:https://sysin.org/blog/how-to-install-macos/,查看最新版.原创作品,转载请保留出处. 作者主页:www.sysin.org 名词解释: 硬件 ...
- Java开发学习(四)----bean的三种实例化方式
一.环境准备 准备开发环境 创建一个Maven项目 pom.xml添加依赖 resources下添加spring的配置文件applicationContext.xml 最终项目的结构如下: 二. ...
- 聊聊 C# 方法重载的底层玩法
最近在看 C++ 的方法重载,我就在想 C# 中的重载底层是怎么玩的,很多朋友应该知道 C 是不支持重载的,比如下面的代码就会报错. #include <stdio.h> int say( ...
- VMware Workstation 虚拟机安装教程
一.介绍篇 VMware Workstation 16 Pro是VMware(威睿公司)于2021年最新发布的一代虚拟机软件,软件的中文名是"VMware 工作站 16 专业版". ...
- BUUCTF-佛系少年
佛系少年 这题我感觉超扯,不知道当时环境是不是断网的,断网咋解密的出来.. 下载后有个压缩包,带加密的,首先16进制看看是否是真加密 这里可以看到,压缩包数据区这里都是未加密的方式 但是到了压缩包目录 ...
- 关于Node.js 链接mysql超时处理(默认8小时)
备注:这是在pm2配置node环境下,超过8小时mysql自动关闭的情况下出现的解决方法:1.封装mysql.js var mysql = require('mysql'); var connecti ...