奇数阶魔方阵的构造
- 初始化:创建一个n×n的矩阵,所有元素初始化为0。
- 填充数字:从矩阵的右上角(第一行最后一列)开始,放置数字1。
- 移动规则:按照以下规则移动填充下一个数字:
- 如果下一个位置在矩阵内且未被填充,则移动到该位置。
- 如果下一个位置在矩阵外,则根据方向(上、右、下、左)循环回到矩阵的对应边界。
- 如果下一个位置已被填充,则根据方向顺时针旋转90度(上变左,左变下,下变右,右变上),然后再次尝试放置数字。
- 重复:重复步骤3,直到所有位置都被填充
以一个3阶魔方阵为例子:详细写出大致思路:
具体代码 :
#include <stdio.h>
#include <strings.h>
int main(void)
{
int n;
printf("Input a num:");
scanf("%d",&n);
int a[n][n];
//printf("sizeof(a) = %ld\n",sizeof(a));
bzero(a,sizeof(a));
int i = 0;
int j = 0;
int k = 1;
int x,y;
a[0][n/2] = 1;
i = 0;
j = n/2;
for (k = 2; k <= n*n; ++k)
{
x = i;
y = j;
++j;
if (j > n-1)
{
j = 0;
}
--i;
if (i < 0)
{
i = n-1;//向上走,遇到边界回到最后一行
}
if (a[i][j] != 0)
{
i = x;
j = y;
++i;
if (i > n-1)
{
i = 0;
}
}
a[i][j] = k;
}
for (i = 0; i < n; ++i)
{
for (j = 0; j < n; ++j)
{
printf("%d ",a[i][j]);
}
putchar('\n');
}
return 0;
}