题目:
输出魔方阵,所谓魔方阵是指这样的方阵,它的每一行,每一列和对角线的和均相等,要输出1-n^2个自然数构成的魔方阵,例如
8 1 6
3 5 7
4 9 2

解决方案

  1. 当n<=2时不存在魔方矩阵
 if(n<3){printf("不存在n=%d的魔方矩阵",n);return;}
  1. 当n为奇数时,可用“罗泊法”即

⑴将1放在第一行中间一列;
⑵从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);
⑶如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;
⑷当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;
⑸如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面。

 if(n%2==1){int count=1;int i=0,j=n/2;a[i][j]=count++;for(int temp=0;temp<n*n-1;temp++){if(a[(i-1+n)%n][(j+1+n)%n]!=0)i=(i+1+n)%n;else{i=(i-1+n)%n;j=(j+1+n)%n;}a[i][j]=count++;}      }

3.当n为偶数时,又分为两种情况,即n能否被4整除

当n能被4整除时,方案如下

(1) 先将整个方阵划分成k*k个4阶方阵,然后在每个4阶方阵的对角线上做记号;
(2) 由左而右、由上而下,遇到没有记号的位置才填数字,但不管是否填入数字,每移动一格数字都要加1;
(3) 自右下角开始,由右而左、由下而上,遇到没有数字的位置就填入数字,但每移动一格数字都要加1。

 if(n%4==0){int num=n/4;for(int i=0;i<num;i++)for(int j=0;j<num;j++){a[4*i+0][4*j+0]=-1;a[4*i+0][4*j+3]=-1;a[4*i+1][4*j+1]=-1;a[4*i+1][4*j+2]=-1;a[4*i+2][4*j+1]=-1;a[4*i+2][4*j+2]=-1;a[4*i+3][4*j+0]=-1;a[4*i+3][4*j+3]=-1;}int count=1;for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(a[i][j]==0)a[i][j]=count++;for(int i=n-1;i>=0;i--)for(int j=n-1;j>=0;j--)if(a[i][j]==-1)a[i][j]=count++;}

当n不能被4整除时,方案如下

填制魔方阵时,先将整个方阵划成田字型的四个2 k + 1阶的奇数阶小方阵,并以下法做注记:
(1)右半两个小方阵中大于k+2的列;
(2)左半两个小方阵中( k + 1 , k + 1 )的格位;
(3)左半两个小方阵中除了( k+1 , 1 )是指第一列第k+1行的格位之外,小于k +1的列。
以奇数阶魔方阵的方法连续填制法依左上、右下、右上、左下的顺序分别填制这四个小方阵。将上半及下半方阵中有注记的数字对调,魔方阵完成。

 if(n%4==2){int num=n/2;int count=1;int sym=1,x=0,y=0;while(sym!=0){int i=0,j=num/2;a[i+x][j+y]=count++;for(int temp=0;temp<num*num-1;temp++){if(a[(i-1+num)%num+x][(j+1+num)%num+y]!=0)i=(i+1+num)%num;else{i=(i-1+num)%num;j=(j+1+num)%num;}a[i+x][j+y]=count++;}switch(sym){case 1:x+=num; y+=num; sym=2; break;case 2:x-=num; sym=3; break;case 3:x+=num; y-=num; sym=4; break;case 4:sym=0; break;}      }int k=(n-2)/4;for(int j=num+k+2;j<n;j++){  //1for(int i=0;i<num;i++){int temp=a[i][j];a[i][j]=a[i+num][j];a[i+num][j]=temp;}}int temp=a[k][k]; a[k][k]=a[k+num][k]; a[k+num][k]=temp;  //2for(int j=0;j<k;j++)for(int i=0;i<num;i++)if(i!=k){int temp=a[i][j];a[i][j]=a[i+num][j];a[i+num][j]=temp;}}

运行结果如下

n=10

n=8

n=9

完整代码示例

void function4(int n){//魔方矩阵int a[100][100];memset(a,0,sizeof(a));if(n<3){printf("不存在n=%d的魔方矩阵",n);return;}if(n%2==1){int count=1;int i=0,j=n/2;a[i][j]=count++;for(int temp=0;temp<n*n-1;temp++){if(a[(i-1+n)%n][(j+1+n)%n]!=0)i=(i+1+n)%n;else{i=(i-1+n)%n;j=(j+1+n)%n;}a[i][j]=count++;}      }if(n%4==0){int num=n/4;for(int i=0;i<num;i++)for(int j=0;j<num;j++){a[4*i+0][4*j+0]=-1;a[4*i+0][4*j+3]=-1;a[4*i+1][4*j+1]=-1;a[4*i+1][4*j+2]=-1;a[4*i+2][4*j+1]=-1;a[4*i+2][4*j+2]=-1;a[4*i+3][4*j+0]=-1;a[4*i+3][4*j+3]=-1;}int count=1;for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(a[i][j]==0)a[i][j]=count++;for(int i=n-1;i>=0;i--)for(int j=n-1;j>=0;j--)if(a[i][j]==-1)a[i][j]=count++;}if(n%4==2){int num=n/2;int count=1;int sym=1,x=0,y=0;while(sym!=0){int i=0,j=num/2;a[i+x][j+y]=count++;for(int temp=0;temp<num*num-1;temp++){if(a[(i-1+num)%num+x][(j+1+num)%num+y]!=0)i=(i+1+num)%num;else{i=(i-1+num)%num;j=(j+1+num)%num;}a[i+x][j+y]=count++;}switch(sym){case 1:x+=num; y+=num; sym=2; break;case 2:x-=num; sym=3; break;case 3:x+=num; y-=num; sym=4; break;case 4:sym=0; break;}      }int k=(n-2)/4;for(int j=num+k+2;j<n;j++){  //1for(int i=0;i<num;i++){int temp=a[i][j];a[i][j]=a[i+num][j];a[i+num][j]=temp;}}int temp=a[k][k]; a[k][k]=a[k+num][k]; a[k+num][k]=temp;  //2for(int j=0;j<k;j++)for(int i=0;i<num;i++)if(i!=k){int temp=a[i][j];a[i][j]=a[i+num][j];a[i+num][j]=temp;}}for(int i=0;i<n;i++){for(int j=0;j<n;j++)printf("%3d ",a[i][j]);printf("\n");}}

输出魔方矩阵(C语言实现)相关推荐

  1. 输出魔方阵---C语言

    输出魔方阵 例如,三阶魔方阵为 8 1 6 3 5 7 4 9 2 所谓魔方阵是指这样的方阵,它的每一行,每一列和对角线之和均相等 解题思路:魔方阵中各数的排列规律,魔方阵的阶数应该为奇数. 将1放在 ...

  2. 判断魔方矩阵c语言程序,有关魔方矩阵的思路问题,向各位请教

    你去数据结构论坛那里看 [热情依旧] 发的 [幻方] 的帖子 幻方是一个方形整数数组,它每行的和,每列的和及两条对角线上的和全部相等,下面的图1.5给出幻方 17 24 1 8 15 23 5 7 1 ...

  3. C/C++小程序学习:n*n魔方矩阵实现每行、每列、每一对角线上的元素之和相等

    用一个程序实现n*n魔方矩阵中,每一行.每一列.每一对角线上的元素之和相等. 矩阵规律: 本程序只适合基数,解释如下:  N 为奇数时,此题中N设为5 (1) 将1放在第一行中间一列; (2) 从2开 ...

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

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

  5. c语言二维数组对角线输出字符,用C编程一个4*4的矩阵,用二维数组,求对角线元素的和。,c语言如何使二维数组 输出为矩阵的形式...

    导航:网站首页 > 用C编程一个4*4的矩阵,用二维数组,求对角线元素的和.,c语言如何使二维数组 输出为矩阵的形式 用C编程一个4*4的矩阵,用二维数组,求对角线元素的和.,c语言如何使二维数 ...

  6. n阶魔方的构成方法C语言,穷举法打印n阶魔方矩阵

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //   穷举法打印n阶魔方矩阵 n <= 10 #include #include int A[ 11 ][ 11 ]; bool Flag[ 1 ...

  7. 用c语言验证5阶魔方矩阵,穷举法打印n阶魔方矩阵

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //   穷举法打印n阶魔方矩阵 n <= 10 #include #include int A[ 11 ][ 11 ]; bool Flag[ 1 ...

  8. vc c语言模拟机械时钟转动算法 -graphics.h,VC6.0n阶魔方矩阵算法刚学C语言老师让做一个程序,输入 爱问知识人...

    哎,为了你这个小东西,大半夜的,我在这机子上装了个VC. 以下是用C文件写的,调试通过,产生哪个啥破矩阵. 先给你几个建议. 1.写程序,只是一个流程翻译的过程.遵循"从上至下,由简至精&q ...

  9. Matlab编程与数据类型 -- 奇数阶魔方矩阵的编程

    本微信图文详细介绍了利用Matlab实现奇数阶魔方矩阵的编程.

  10. Matlab与线性代数 -- 魔方矩阵

    本图文主要介绍了如何利用Matlab实现魔方矩阵.

最新文章

  1. Linux 下 LaTeX 2018 安装与使用
  2. jQuery Masonry 一个 jQuery动态网格布局的插件
  3. 杭州 | PMCAFF 产品经理第一课,面向3-5年产品经理,全面提升产品战略能力
  4. 3D Printer 开发进程一。 步进电机升降台设计图纸。
  5. win7关机快捷键_电脑快捷键大全(上)
  6. 【Java】函数式编程
  7. dns迭代查询配置_dns解析?瞅瞅这篇文章
  8. 作者:司恩哲(1985-),男,就职于中国人民银行征信中心数据部
  9. Java实现归并排序(转)
  10. streamVR里面自带的交互的例子
  11. DAVINCI DM6446 开发攻略——V4L2视频驱动和应用分析
  12. 修改c盘user用户文件夹名称
  13. Scrapy框架基础了解
  14. Android使用AIUI快速搭建智能助手
  15. 工作日记---android lockscreen.java 在lock状态下显示charing和alarm
  16. 国外问卷调查这个项目可以做吗?
  17. 使用正则匹配iframe标签
  18. 远程教育两周,家长崩溃简史
  19. ASP.NET Core中如何显示[PII is hidden]的隐藏信息
  20. 准备春招 CSDN博客不定期脱更 见谅

热门文章

  1. java jsp试卷_JSP试题-带答案
  2. 精曲的竖曲线4800计算程序,可以计算直线与竖曲线通杀
  3. PPAPI插件与浏览器的通信
  4. 如何在两年内做出一个Apache顶级开源数据库——乔嘉林
  5. 下载carplay安卓版_apple carplay
  6. android车机升级carplay,现代增加支持DIY升级CarPlay,Android Auto的车型
  7. Python语音转文字、音频切割、语音识别
  8. 计算机命令提示符的使用,命令提示符(电脑系统命令提示符的打开方法)
  9. 推荐几款 Redis 可视化工具
  10. 番茄时间管理法:一个番茄是如何让你工作更有效率的