一、魔方阵规律;
8 1 6
3 5 7
4 9 2
魔方阵中各数的排列规律如下:
(1)将1放在第1行中间一列。
(2)从2开始直到n×n止,各数依次按此规则存放:每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列)。
(3)如果上一数的行数为1,则下一个数的行数为n(指最下一行)。例如,1在第1行,则2应放在最下一行,列数同样加1。
(4)当上一个数的列数为n时,下一个数的列数应为1,行数减1。例如,2在第3行最后一列,则3应放在第2行第1列。
(5)如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。例如,按上面的规定,4应该放在第1行第2列,但该位置已被1占据,所以4就放在3的下面。由于6是第1行第3列(即最后一列),故7放在6下面。
二、N-S流程图;
三、运行结果;
四、源代码;
# define _CRT_SECURE_NO_WARNINGS
# include <stdio.h>int main()
{//初始化变量值;int a[15][15], p = 0, i, j, k, n;//获取输出几阶魔法阵;printf("请输入n的值:");//循环判断n为小于15的奇数;while (p == 0){//获取用户输入数据;scanf("%d", &n);//判断;if (n % 2 != 0){p = 1;}}//填充矩阵数据;for (i = 1; i <= n; i++){//列;for (j = 1; j <= n; j++){//填充;a[i][j] = 0;}}//赋值;j = n / 2 + 1;a[1][j] = 1;//实现魔方阵;for (k = 2; k < n * n; k++){//运算;i = i - 1;j = j + 1;//判断是否为第一行最后一列;if ((i < 1) && (j > n)){i = i + 2;j = j - 1;}else{//是否为第一行;if (i < 1){i = n;}//是否为最后一列;if (j > n){j = 1;}}//判断数据存储位置是否为空;if (a[i][j] == 0){//填充;a[i][j] = k;}else{i = i + 2;j = j - 1;a[i][j] = k;}}//输出魔方阵;for (i = 1; i <= n; i++){//列;for (j = 1; j <= n; j++){//输出;printf("%5d", a[i][j]);}//换行;printf("\n");}return 0;
}