<1>题目描述
输出“魔方阵”,所谓魔方阵是指它的每一行、每一列和对角线之和均相等。例如:
8 1 6
3 5 7
4 9 2
要求输出1——n^2的自然数构成的魔方阵
<2>思路分析
- 将1放在第1行中间一列
- 从2开始直到n*n止,各数依次按此规则存放:每一个数字存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列)
- 如果上一数的行数为1,则下一个数的行数为n(指最后一行)。(例如,1在第1行,则2应该放在最下一行,列数同样加1)
- 当上一个数的列数为n时,下一个数的列数应为1,行数减1.例如,2在第3行最后一列,则3应该放在第2行第1列。
- 如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。(例如,按上面的规定,4应该放在第1行第2列,但该位置已被1占据,所以4就放在3的下面。)
<3>代码实现
int main()
{
int a[15][15] = {0};
int i, j, k, n;
int p = 1;
while (p == 1)
{
printf("请输入n = 1~15(n阶方阵,要求n为奇数):"); //要求阶数为1~15奇数
scanf("%d",&n);
if ((n != 0) && (n <= 15) && (n % 2) != 0)
p = 0;
}
//初始化
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
a[i][j] = 0;
}
}
//建立魔方阵
j = n / 2 + 1;
a[1][j] = 1; //将第一行中间一列置为1
for (k = 2; k <= n * n; k++) //将剩下的n*n-1个元素赋值
{
//从2开始直到n*n止,各数依次按此规则存放:放一个数存放的行比前一个数的行数减1,列数加1
i = i - 1;
j = j + 1;
//阻止将数字放在方阵外面
if ((i < 1) && (j > n))
{
i = i + 2;
j = j - 1;
}
else
{
//如果上一数的行数为1,则下一个数的行数为n
if (i < 1) //i = i-1(如果i=1,则1-1=0,0<1)
i = n;
//当上一个数的列数为n时,下一个数的列数应为1
if (j > n) //j = j+1(如果j=n,则n+1=n+1,n+1>n)
j = 1;
}
//下面是赋值操作
if (a[i][j] == 0)
a[i][j] = k;
else
{
//如果上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面
i = i + 2;
j = j - 1;
a[i][j] = k;
}
}
//打印输出
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
printf("%-4d",a[i][j]);
}
putchar('\n');
}
return 0;
}
<4>结果展示
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)