博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
魔方阵算法
阅读量:7171 次
发布时间:2019-06-29

本文共 1488 字,大约阅读时间需要 4 分钟。

输出"魔方阵"。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为

      8 1 6
      3 5 7
      4 9 2
要求输出1~n*n的自然数构成的魔方阵。
解:魔方阵中各数的排列规律如下:
(1)将1放在第1行的中间一列。
(2)从2开始直到n×n止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列).
(3)如果上一数的行数为1,则下一个数的行数为n(指最下一行)。例如,1在第一行,则2应放在最下一行,列数同样加1. 
(4)当上一个数的列数为n时,下一个数的列数应为1,行数减1.例如,2在第3行最后一列,则3应放在第2行第1列。
(5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如,按上面的规定,4应该放在第1行第2列,但该位置已经被1占据,
所以4就放在3的下面。7应该放在第3行第1列,但该位置已经被4占据,故7放在6下面。
按此方法可以得到任何阶的魔方阵。

注意:魔方阵的阶数应奇数,程序指定其最大值为15。今定义数组a为16行16列,对第0行0列不用来存放数据,只用第1~15行,使读者看程序时比较符合习惯。

 

1 #include
2 #include
3 #define SIZE 50; 4 main() 5 { 6 int row, col, n, value; 7 int a[SIZE+1][SIZE+1]; 8 printf("请输入要输出魔方阵的阶数n(奇数, <%d):n=",SIZE); 9 scanf("%d",&n);10 if(!(n%2)||n<1||n==0) 11 {12 printf("输入有误!\n");13 exit(0);14 }15 row = 1; col = (n+1)/2; value = 1;16 while(value<=n*n) 17 {18 a[row][col] = value;19 if(value%n!=0)20 {21 row--;22 col++; 23 if(row<1)24 row=3;25 if(col>n)26 col=1; 27 }28 else29 row++;30 value=value+1; 31 }32 printf("\n%d 阶魔方阵如下所示:\n\n",n);33 for(row = 1; row <= n; row++)34 {35 for(col = 1; col <= n; col++)36 printf("%5d",a[row][col]);37 printf("\n");38 }39 }

 

 

转载于:https://www.cnblogs.com/wspaceworld/archive/2012/05/29/2492635.html

你可能感兴趣的文章
《鸟哥的Linux私房菜》读书笔记--第0章 计算机概论 硬件部分
查看>>
02、学PHP可以干什么
查看>>
iOS - WXPay 微信支付
查看>>
tcp/ip高效编程总结
查看>>
hdu 4739 Zhuge Liang's Mines 2013 ACM/ICPC Asia Regional Hangzhou Online
查看>>
陈远波(java)--Git 入门
查看>>
动态新增文本框
查看>>
消息队列
查看>>
类型和成员基础
查看>>
【Java】同步阻塞式(BIO)TCP通信
查看>>
java基础自定义测试异常类
查看>>
第一章 第一节
查看>>
不使用运算符计算加减乘除的问题
查看>>
apply()和call()的区别
查看>>
部署网站(虚拟主机,MVC站点,前后台,百度编辑器)出现的问题
查看>>
Chrome 跨域调试
查看>>
static IP wpa代替network-manager
查看>>
解决android TextView多行文本(超过3行)使用ellipsize属性无效问题
查看>>
清除浮动clear:both的应用详解
查看>>
BZOJ 2732 射箭
查看>>