幻方的构造根据n的取值不同有不不同的解法。n取值为奇数,4的倍数(双偶数),非4的倍数的偶数(单偶数)分别对应3种不同的解法。具体步骤参考百度幻方解法。

接下来放代码

/**@Date 2019-09-30*@Author krisfan*@Description 求解任意n阶幻方阵*/
#include <stdio.h>
#include <stdlib.h>
void outmagic(int** a, int n);
void magic2k1(int** a, int n, int idx, int ox, int oy);
void magic4k(int** a, int n);
void magic4k2(int** a, int n);
int main(void) //求解任意n阶幻方阵
{int **a, i, n;printf("输入要构造的幻方阶数:");scanf("%d", &n); //输入n阶if (n > 2) {a = (int**)malloc(sizeof(int*) * n); //分配n个数组行指针for (i = 0; i < n; i++)a[i] = (int*)malloc(sizeof(int) * n); ///分配行if (n % 2 == 1)magic2k1(a, n, 0, 0, 0); //奇数阶幻方阵else if (n % 4 == 0)magic4k(a, n); //双偶阶幻方阵elsemagic4k2(a, n); //单偶阶幻方阵outmagic(a, n);for (i = 0; i < n; i++)free(a[i]);free(a);} elseprintf("error input:n>2\n");return 0;
}
void outmagic(int** a, int n) //输出n阶幻方阵
{int i, j, s, l;for (i = 0; i < n; i++) {s = 0;printf(" ");for (j = 0; j < n; s = s + a[i][j], j++)printf("%4d ", a[i][j]);printf(" =%4d\n", s); //输出行之和}printf("=");for (j = 0; j < n; j++) {s = 0;for (i = 0; i < n; i++)s += a[i][j];printf("%4d ", s); //输出列之和}l = s = 0;for (i = 0; i < n; i++) {s += a[i][i];l += a[i][n - 1 - i];}printf(" =%4d +%4d\n", s, l); //输出对角线和反对角线之和
}
void magic2k1(int** a, int n, int idx, int ox, int oy) //奇数阶幻方解法
{int i, x, y = 0;x = n / 2;for (i = idx + 1; i <= idx + n * n; i++) {a[oy + y][ox + x] = i;if (i % n == 0)y++;elsex++, y--;x = (x % n + n) % n;y = (y % n + n) % n;}
}
void magic4k(int** a, int n) //双偶阶幻方针求解
{int i, j, m, l, s;int x = 0, y = 0, ox, oy;l = n * n;for (i = 1; i <= l; i++) {a[y][x] = i;if (i % n == 0) {x = 0;y++;} elsex++;}s = 1 + l;m = n / 4;x = y = ox = oy = 0;l = m * m;for (j = 1; j <= l; j++) {for (i = 0; i < 4; i++) {a[oy + i][ox + i] = s - a[oy + i][ox + i];a[oy + i][ox + 3 - i] = s - a[oy + i][ox + 3 - i];}if (j % m == 0) {ox = 0;oy += 4;} elseox = j % m * 4;}
}
void magic4k2(int** a, int n) //单偶阶幻方针求解
{int i, j, k, m, L;magic2k1(a, n / 2, 0, 0, 0);magic2k1(a, n / 2, n * n / 4, n / 2, n / 2);magic2k1(a, n / 2, n * n / 2, n / 2, 0);magic2k1(a, n / 2, n * n * 3 / 4, 0, n / 2);m = (n - 2) / 4;for (i = 0; i < n / 2; i++) {for (j = 0; j < m; j++) {k = (i == n / 4) ? n / 4 + j : j;L = a[i][k];a[i][k] = a[i + n / 2][k];a[i + n / 2][k] = L;}for (j = 0; j < m - 1; j++) {k = n / 2 + n / 4 + j;L = a[i][k];a[i][k] = a[i + n / 2][k];a[i + n / 2][k] = L;}}
}

运行结果

n=5,奇数

n=6,单偶数

n=8,双偶数

经测试没有问题。

任意n阶幻方(魔方)构造——C语言实现相关推荐

  1. Python之任意阶幻方的构造

    本文在用Python构造任意阶幻方的时候,参考的资料如下: - 维基百科:https://en.wikipedia.org/wiki/Magic_square - 幻方:http://blog.csd ...

  2. 【qduoj】奇数阶幻方 (构造)

    题干: C语言_魔方阵 描述 魔方阵是一个古老的智力问题,它要求在一个m×m的矩阵中填入1-m2的数字(m为奇数),使得每一行.每一列.每条对角线的累加和都相等,如下为5阶魔方阵示例. 15 8 1 ...

  3. Matlab 基础应用01 - Python 基础应用 n阶幻方【MagicSquare】和构造

    前言: 本章介绍幻方的基本知识,同时利用Matlab 和 Python 构造简单的幻方方阵. 最后用幻方结合图像,展示了一个渐进的魔幻效果. 幻方定义: 简单介绍 幻方(Magic Square)是一 ...

  4. 任意阶幻方的c++实现----奇阶幻方、双偶幻方、单偶幻方。

    幻方分为3类.奇阶幻方(奇数).双偶幻方(能够被4整除,如8,12,16--).单偶幻方(4m+2形式,如6,10--),构造算法各不相同. 下面的程序中,奇阶幻方的构造算法为Merzirac法.双偶 ...

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

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

  6. 任意阶幻方的python编程实现

    摘要:提出任意阶幻方的python语言的实现方法,分为奇数阶,偶数阶(n为整数,分为4n阶和4n+2阶幻方),速度还算可以,你可以体会以下.测试999阶幻方可以算出来: 1,什么是幻方 幻方(Magi ...

  7. 任意阶幻方解法及c++实现

    任意阶幻方的解法及c++实现 在一个由若干个排列整齐的数组成的正方形中,图中任意一横行.一纵行及对角线的几个数之和都相等,具有这种性质的图表,称为"幻方".我国古代称为" ...

  8. 任意阶幻方的解法及c++实现

    任意阶幻方的解法及c++实现 在一个由若干个排列整齐的数组成的正方形中,图中任意一横行.一纵行及对角线的几个数之和都相等,具有这种性质的图表,称为"幻方".我国古代称为" ...

  9. 双偶幻方的c语言算法,单偶阶、双偶阶幻方的巧妙填法

    单偶阶.双偶阶幻方的巧妙填法 单偶阶.双偶阶幻方的巧妙填法 人气:150 ℃时间:2019-12-07 19:18:09 优质解答 一.双偶幻方的解法 能被4整除的n阶幻方叫双偶幻方,如8阶.12阶. ...

最新文章

  1. 安川机器人如何备份_YASKAWA机器人视觉局域网设置参考
  2. dynamodb java_使用Java扫描DynamoDB项目
  3. C# 将PDF转为Excel
  4. excel 2007 vba与宏完全剖析_Excel宏VBA小技巧系列 | 分段加合
  5. python_GUI操作(鼠标、键盘)
  6. Quartz.NET WinFrom 关闭程序后无法结束进程
  7. capjoint一些生成文件的解释
  8. 把C#逻辑处理程序搬移至SQL存储过程中去
  9. DBC连接数据库经验技巧
  10. 2020年12月中国编程语言排行榜 - Java地位岌岌可危
  11. halcon算子翻译——cooc_feature_image
  12. 外贸7日通-外贸流程详解 第六天
  13. 字符串练习:手机号码屏蔽,身份证号码信息查看,游戏骂人敏感词替换
  14. cs231n-2022-assignment1#Q1:kNN图像分类器实验
  15. autocad显卡驱动文件hdi_AUTOCAD启动提示显示驱动文件丢失怎么办?hdi是什么文件?...
  16. BlueHost独立服务器受站长欢迎的原因
  17. HTTP与Web安全总结
  18. ORA-39181: Only partial table data may be exported due to fine grain access control on “OE“.“PURCHAS
  19. Scratch猫抓老鼠游戏 电子学会图形化编程scratch等级考试三级真题答案2019-9
  20. Linux下编译leveldb报错,leveldb ubuntu 11.04下编译失败问题

热门文章

  1. c语言与汇编语言子程序,用汇编语言设计程序实现10!,并用调用子程序的方法实现1!+2!+3!+…...
  2. 苹果和特斯拉供应商台达电子遭勒索攻击 360专家提出四点建议应对
  3. 高等教育学:高等教育与高等教育学
  4. 蓝桥杯 prev37 分巧克力
  5. 计算机广告制作要英语,广告电脑制作,advertisement coputer production,音标,读音,翻译,英文例句,英语词典...
  6. 两个小程序(刷人气)
  7. 小米6X刷机升级MIUI13实现内存扩展(新手教程)
  8. 道闸系统服务器内存不足,五大道闸系统常见故障以及解决方案
  9. python三维建模_3D One 2.5引爆新思维,用趣味编程来实现3D建模!
  10. 【Linux学习】远程连接linux