生成魔方的规则如下
定义一个N*N阶的魔方,其中N>=2;
那么假设在这个N阶的魔方中的某一元素的位置为(x,y);则它的左上角的位置为(x-1,y-1);那么有如下规则:
(1)如果x-1>=0,不用直接调整位置,直接填入,否则位置调整为(x-1+m);
(2)如果y-1>=0,不用直接调整位置,直接填入,否则位置调整为(y-1+m);
(3)如果所要求的位置已经填入数据,则在同一列的下一行填入一个数字。而此时x和y调整为之前的上一行上一列,所以调整的位置为x跨两行,y跨一列,既(x+2,y+1);
由于魔方的上下左右相接,所以在所求的位置都需要对N进行取模运算。
附上代码如下:
#include<stdio.h> //此程序创建于2018年12月15日
#define M 30 //定义一个最大阶次的魔方阵
void MagicsquareInit(int MS[M][M], int m)
{
int i, j;
for (i = 0; i < m; i++)
for (j = 0; j < m; j++)
MS[i][j] = 0; //矩阵全清零
}
void Mgicsquare(int MS[M][M], int m)
{
int x, y, i;
x = 0, i;
y = m / 2;
MS[x][y] = 1; //第0行的中间位置填1;
for (i = 2; i <= m*m; i++)
{
x = (x - 1 + m) % m;
y = (y - 1 + m) % m;
if (MS[x][y] != 0)
{
x = (x + 2) % m;
y = (y + 1) % m;
}
MS[x][y] = i;
}
}
void MagicSquarePrint(int MS[M][M], int m)
{
int i, j;
for (i = 0; i < m; i++)
{
for (j = 0; j < m; j++)
printf("%-4d", MS[i][j]);
printf("\n");
}
}
int main()
{
int MS[M][M];
int n;
printf("请输入魔方的阶数:\n");
scanf("%d",&n);
MagicsquareInit(MS, n);
Mgicsquare(MS, n);
MagicSquarePrint(MS, n);
}