任意阶幻方(魔方矩阵)C语言实现
------------------来自百度
先标出引用地址:
http://blog.ddedu.com.cn/user1/88/archives/2007/2007420143329.shtml //任意阶幻方构造方法
http://blog.csdn.net/cmutoo/article/details/5487157 //任意阶幻方C语言代码实现(有些许错误)
基础知识这里看:http://blog.csdn.net/oowgsoo/article/details/1567910
任意阶幻方的构造方法有很多种,所以要选定一种易于代码实现的一种
在上篇博客中说道:
/************************************************************************************
幻方的数量:
与我们大多数人的常识不同,幻方的数量不是唯一的,而且也不是一个简单的问题
3阶幻方只有1种
4阶幻方有880种,通过旋转和反射,总共可以有7040个幻方
5阶幻方有275 305 224个,这是用计算机算的
6阶幻方,大概是1.7743*10**19~1.7766*10**19之间,这是用统计学方法计算的,居然计算机也算不出来,更不要说6阶以上的幻方数量了
************************************************************************************/
所以代码实现的就有很大的局限性,只能实现某一种构造方法的幻方
幻方构造分为
1、奇数阶
2、双偶阶
3、单偶阶
三种。
对于奇数阶的幻方:
/*******************************************************************
把1(或最小的数)放在第一行正中; 按以下规律排列剩下的n×n-1个数:
(1)每一个数放在前一个数的右上一格;
(2)如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;
(3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;
(4)如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在前一个数的下一行同一列的格内;
(5)如果这个数所要放的格已经有数填入,处理方法同(4)。
这种写法总是先向“右上”的方向,象是在爬楼梯。
void Odd(int n,int index) {while(st != index){cube[ox+stx][oy+sty] = st++;if((st-1) % n != 0){stx--;sty++;}else{stx++;}stx = ((stx-1)%n+n)%n+1;sty = (sty%n == 0 ? n : sty%n);} }
对于双偶数阶的
就是一个中心对称
void DouEven(int n) {int i,j;int st = 1;for(i=1; i<=n; i++){for(j=1; j<=n; j++){cube[i][j] = st++;}}int zx,zy,fx,fy;for(i=4; i<=n*n; i+=4){for(j=4; j<=n*n; j+=4){zx=i-3,zy=j-3,fx=i,fy=j-3;cube[zx][zy]=n*n-cube[zx][zy]+1;cube[zx+1][zy+1]=n*n-cube[zx+1][zy+1]+1;cube[zx+2][zy+2]=n*n-cube[zx+2][zy+2]+1;cube[zx+3][zy+3]=n*n-cube[zx+3][zy+3]+1;cube[fx][fy]=n*n-cube[fx][fy]+1;cube[fx-1][fy+1]=n*n-cube[fx-1][fy+1]+1;cube[fx-2][fy+2]=n*n-cube[fx-2][fy+2]+1;cube[fx-3][fy+3]=n*n-cube[fx-3][fy+3]+1;}} }
对于单偶数阶的,麻烦许多
因为要用到奇数阶的构造方法
void SingleEven(int n) {int i,j;ox=oy=0;st=1;stx=1,sty=(n/2+1)/2;Odd(n/2,n*n*1/4+1); //A ox=oy=n/2;stx=1,sty=(n/2+1)/2;Odd(n/2,n*n*2/4+1); //D ox=0,oy=n/2;stx=1,sty=(n/2+1)/2;Odd(n/2,n*n*3/4+1); //B ox=n/2,oy=0;stx=1,sty=(n/2+1)/2;Odd(n/2,n*n*4/4+1); //Cint k=(n-2)/4,tmp;for(j=1; j<=n/2; j++){for(i=1; i<=k; i++){if(j != (n/2+1)/2){tmp = cube[j][i];cube[j][i] = cube[j+n/2][i];cube[j+n/2][i] = tmp;}else{tmp = cube[j][i+(n/2+1)/2-1];cube[j][i+(n/2+1)/2-1] = cube[j+n/2][i+(n/2+1)/2-1];cube[j+n/2][i+(n/2+1)/2-1] = tmp;}}}if(k-1){for(i=1; i<=n/2; i++){int tmpp = (3*n+2)/4-1;for(j=1; j<=k-1; j++){tmp = cube[i][j+tmpp];cube[i][j+tmpp] = cube[i+n/2][j+tmpp];cube[i+n/2][j+tmpp] = tmp;}}} }
最后贴一个完整的代码:
#include <stdio.h> #include <string.h>int cube[1000][1000]; int stx,sty; int st; int num; int ox,oy;void Odd(int n,int index) {while(st != index){cube[ox+stx][oy+sty] = st++;if((st-1) % n != 0){stx--;sty++;}else{stx++;}stx = ((stx-1)%n+n)%n+1;sty = (sty%n == 0 ? n : sty%n);} }void DouEven(int n) {int i,j;int st = 1;for(i=1; i<=n; i++){for(j=1; j<=n; j++){cube[i][j] = st++;}}int zx,zy,fx,fy;for(i=4; i<=n*n; i+=4){for(j=4; j<=n*n; j+=4){zx=i-3,zy=j-3,fx=i,fy=j-3;cube[zx][zy]=n*n-cube[zx][zy]+1;cube[zx+1][zy+1]=n*n-cube[zx+1][zy+1]+1;cube[zx+2][zy+2]=n*n-cube[zx+2][zy+2]+1;cube[zx+3][zy+3]=n*n-cube[zx+3][zy+3]+1;cube[fx][fy]=n*n-cube[fx][fy]+1;cube[fx-1][fy+1]=n*n-cube[fx-1][fy+1]+1;cube[fx-2][fy+2]=n*n-cube[fx-2][fy+2]+1;cube[fx-3][fy+3]=n*n-cube[fx-3][fy+3]+1;}} }void SingleEven(int n) {int i,j;ox=oy=0;st=1;stx=1,sty=(n/2+1)/2;Odd(n/2,n*n*1/4+1); //A ox=oy=n/2;stx=1,sty=(n/2+1)/2;Odd(n/2,n*n*2/4+1); //D ox=0,oy=n/2;stx=1,sty=(n/2+1)/2;Odd(n/2,n*n*3/4+1); //B ox=n/2,oy=0;stx=1,sty=(n/2+1)/2;Odd(n/2,n*n*4/4+1); //Cint k=(n-2)/4,tmp;for(j=1; j<=n/2; j++){for(i=1; i<=k; i++){if(j != (n/2+1)/2){tmp = cube[j][i];cube[j][i] = cube[j+n/2][i];cube[j+n/2][i] = tmp;}else{tmp = cube[j][i+(n/2+1)/2-1];cube[j][i+(n/2+1)/2-1] = cube[j+n/2][i+(n/2+1)/2-1];cube[j+n/2][i+(n/2+1)/2-1] = tmp;}}}if(k-1){for(i=1; i<=n/2; i++){int tmpp = (3*n+2)/4-1;for(j=1; j<=k-1; j++){tmp = cube[i][j+tmpp];cube[i][j+tmpp] = cube[i+n/2][j+tmpp];cube[i+n/2][j+tmpp] = tmp;}}} }void print(int n) {int i,j;for(i=1; i<=n; i++){int sum = 0;for(j=1; j<=n ; j++){sum += cube[i][j];printf("%4d",cube[i][j]);}printf(" sum = %d",sum);printf("\n");} }int main() {int i,j,k,t,n,m;do{printf("Please Input n(3-17): ");scanf("%d",&n);if(n<3)continue;memset(cube,0,sizeof(cube));if(n % 2 == 1){stx=1,sty=(n+1)/2;ox=oy=0;st=1;Odd(n,n*n+1);print(n);}else if(n % 4 == 0){DouEven(n);print(n);}else if(n % 2 ==0 && n % 4 != 0){SingleEven(n);print(n);}}while(1);return 0; }
再上一个专门关于介绍幻方的博客:http://blog.sina.com.cn/u/1225071715
转载于:https://www.cnblogs.com/ccccnzb/p/4017872.html
任意阶幻方(魔方矩阵)C语言实现相关推荐
- 任意阶幻方的python编程实现
摘要:提出任意阶幻方的python语言的实现方法,分为奇数阶,偶数阶(n为整数,分为4n阶和4n+2阶幻方),速度还算可以,你可以体会以下.测试999阶幻方可以算出来: 1,什么是幻方 幻方(Magi ...
- Python之任意阶幻方的构造
本文在用Python构造任意阶幻方的时候,参考的资料如下: - 维基百科:https://en.wikipedia.org/wiki/Magic_square - 幻方:http://blog.csd ...
- 任意阶幻方解法及c++实现
任意阶幻方的解法及c++实现 在一个由若干个排列整齐的数组成的正方形中,图中任意一横行.一纵行及对角线的几个数之和都相等,具有这种性质的图表,称为"幻方".我国古代称为" ...
- 任意阶幻方的解法及c++实现
任意阶幻方的解法及c++实现 在一个由若干个排列整齐的数组成的正方形中,图中任意一横行.一纵行及对角线的几个数之和都相等,具有这种性质的图表,称为"幻方".我国古代称为" ...
- 任意n阶幻方(魔方)构造——C语言实现
幻方的构造根据n的取值不同有不不同的解法.n取值为奇数,4的倍数(双偶数),非4的倍数的偶数(单偶数)分别对应3种不同的解法.具体步骤参考百度幻方解法. 接下来放代码 /**@Date 2019-09 ...
- 任意阶幻方的c++实现----奇阶幻方、双偶幻方、单偶幻方。
幻方分为3类.奇阶幻方(奇数).双偶幻方(能够被4整除,如8,12,16--).单偶幻方(4m+2形式,如6,10--),构造算法各不相同. 下面的程序中,奇阶幻方的构造算法为Merzirac法.双偶 ...
- 判断魔方矩阵c语言程序,有关魔方矩阵的思路问题,向各位请教
你去数据结构论坛那里看 [热情依旧] 发的 [幻方] 的帖子 幻方是一个方形整数数组,它每行的和,每列的和及两条对角线上的和全部相等,下面的图1.5给出幻方 17 24 1 8 15 23 5 7 1 ...
- 魔方游戏实现:任意阶魔方的表示
第一节 魔方的简单表示 对于任意N阶的魔方均有六个面(Surface),每个面有N*N个方块.在面向对象的程序设计里,我们可以把魔方(Cube).魔方的面(Surface)和面的方块(Block)均视 ...
- 任意阶魔方阵matlab程序,【精品】任意阶魔方阵算法(c语言)
n阶幻方是由前n^2(n的2次方)个自然数组成的一个n阶方阵,其各行.各列及两条对角线所含的n个数的和相等.洛书就是最基本的3×3阶魔方阵,做出某种最恰当的决定,横竖都有3个格. 0的倒数 a-1可以 ...
最新文章
- 从计算机视觉的小白变为大神,你需要经历这七个阶段
- 2014年第五届蓝桥杯决赛Java本科B组试题解析
- Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...): singular fit encountered
- Office 2010 系统要求
- matlab逆变换法产生随机数_matlab数值积分方法(一)
- iis6.0与asp.net的运行原理
- Linux——VIM学习选取多行(转)
- WPF Visibility的用法
- 高效率的全组合算法(Java版实现)
- 一步一步写算法(之图添加和删除)
- linux 进程崩溃log,Linux系统日志及日志分析
- 因为intel显卡和nvidia显卡驱动不兼容造成的ubuntu系统循环登录和黑屏问题解决方法
- 高德地图加载谷歌地图瓦片
- 软件测试面试-为什么选择软件测试?
- python人民币转大写_python2.x实现人民币转大写人民币
- java输入长和宽输出面积_JAVA根据用户输入的长和宽,编程求长方形的面积和周长....
- 【已解决】No module named “win32com“ win32com 无法导入
- 【Beeple同款】NFT 电子艺术画框上架链作
- 理解精准营销,知道这5个阶段就够了!
- C语言学习--求圆面积和求正方体的体积 ,平均数---2022.9.3
热门文章
- 【51Nod - 1279】 扔盘子(思维)(on-p会超时)
- Apollo进阶课程 ⑦ | 高精地图的采集与生产
- 清楚linux缓存文件,Linux删除文件 清除缓存
- java创建的zip没写入权限,java中的zip创建错误
- java 多目录 编译jar_javac编译多个包下的、依赖其他jar包的java文件
- curl 请求日志_kong api网关日志 将请求和响应数据附加到磁盘上的日志文件中
- creo组装后怎样移动元件_BGA元件SMT装配工艺要点简介
- 日期时间格式之间的相互转换
- JBPM4.4整合SSH2项目
- mysql导入source数据库sql的C++实现和封装