一、题目: 输出魔方阵
二、解题思路:(刚拿到这道题完全没思路,用MATLAB输出了好几个奇数魔方阵,才找到规律)
1、将1放在第一行中间一列;
2、从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1;
3、如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;
4、当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;
5、如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;
三、代码如下:
#define n 5 //定义一个宏
#include <stdio.h>
#include <math.h>
int magic_str(int arr[n][n])
{
int num = 0;
int i = 0;
int j = 0;
int count = 1;
j=n/2;
for (num=1; num<=pow(n,2); num++) //循环产生 1—n^2 的数。
{
if (i<0)
{
i=n-1;
}
else if (j<0)
{
j=n-1;
}
else if (i>=n)
{
i=0;
}
else if (j>=n)
{
j=0;
}
arr[i--][j++]=num; //确定 num=1的位置 arr[i][j]中的行列值 ,每次行数减一,列数加一
if (num==(n*count)) //根据规律如果num==n的倍数 产生相应的i,j 值
{
i=i+2;
j=j-1;
count++;
}
}
return 0;
}
void print_str(int arr[n][n])
{
int i = 0;
int j = 0;
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
printf("%2d ",arr[i][j]); //循环输出
}
printf("\n");
}
}
int main ()
{
int arr[n][n]={0};
magic_str(arr);
print_str(arr);
return 0;
}
四、运行结果:
3*3魔方阵
5*5魔方阵
7*7魔方阵
五、神叨叨、给大家说话魔方阵的神奇(每行,每列,对角线 元素之和相等,矩阵中没有重复元素),魔力吧。他还有个比较吊的名字“纵横图”,有没有叱咤乾坤的感觉。给大家来张魔方阵图
———————————————欢迎大家指正和留言交流———————————————