打印魔方阵,首先我们得知道魔方阵的编写规律:
魔方阵的填充规律如下:
假设当前创建了一个矩阵:
int matrix[16][16];
- 第一步,我们知道了,1是放在第一行中间一列,那么我们就可以在矩阵中放入1所在的位置
//1、第一行的中间为1
int mid = n / 2;
matrix[0][mid] = 1;
- 第二步,我们知道:最后一行的中间数字为n^2,其右边为2
//2、最后一行的中间数字为n^2,其右边为2
matrix[n - 1][mid] = n * n;
matrix[n - 1][mid + 1] = 2;
- 第三步,我们根据规律,使用if…else if…else语句进行不同条件的判断,对其实现不同的处理操作即可
注意事项:
1)用一个while循环进行矩阵的填充,因为1,2以及n^2 都已经填入,因此我们只要循环到3~n^2-1也填入矩阵中即可
2)除了当前元素处在第一行的最后一列以外,其它情况每次填充前都需要判断条件④中的④若按照上述规则确定的位置上已经放置有数,则下一位放在其下面,即[row + 1][column]
/*
3、从2开始,各数依次按如下规则存放:
①每个数的下一位在其右上方,即行数减1,列数加1,即[row-1][column+1]
②若当前数在第一行,则下一位在最后一行,列数同样加1,即[n-1][column+1]
③若当前数在最后一列,则下一位的列数为1,行数同样减1,即[row-1][0]
④若按照上述规则确定的位置上已经放置有数,或当前数在第一行最后一列,
即在[0][n-1],则下一位放在其下面,即[row+1][n-1]
*/
//由于n*n已经确定,因此只需要放置3~n*n-1
int finalNum = n * n - 1;
int curNumber = 3; //记录当前要填入的数字
int row = n - 1;
int column = mid + 1;
//当前2所在的位置是[n-1][mid+1]
while (curNumber <= finalNum)
{
//④若按照上述规则确定的位置上已经放置有数,或当前数在第一行最后一列,
//即在[0][n - 1],则下一位放在其下面,即[row + 1][n - 1]
if (row == 0 && column == n - 1)
{
row += 1;
matrix[row][column] = curNumber++;
}
//②若当前数在第一行,则下一位在最后一行, 列数同样加1,即[n - 1][column + 1]
else if (row == 0 && column!=n-1)
{
//考虑条件④
if (matrix[n-1][column+1] != 0)
{
row += 1;
//matrix[row][column] = curNumber++;
}
else
{
row = n - 1;
column += 1;
}
matrix[row][column] = curNumber++;
}
//③若当前数在最后一列,则下一位的列数为1,行数同样减1,即[row-1][0]
else if (column == n - 1 && row!=0)
{
//考虑条件④
if (matrix[row-1][0] != 0)
{
row += 1;
//matrix[row][column] = curNumber++;
}
else
{
row -= 1;
column = 0;
}
matrix[row][column] = curNumber++;
}
//①每个数的下一位在其右上方,即行数减1,列数加1,即[row-1][column+1]
else
{
//考虑条件④
if (matrix[row-1][column+1] != 0)
{
row += 1;
//matrix[row][column] = curNumber++;
}
else
{
row -= 1;
column += 1;
}
matrix[row][column] = curNumber++;
}
}
源代码:
/*
E26. 【二维数值数组】打印 n 阶魔方阵( n 为奇数)。魔方阵的每一行、每一列和对角线元素之和都相等。
*/
/*
3*3魔方阵如下:
8 1 6
3 5 7
4 9 2
*/
#include<stdio.h>
int matrix[16][16];
void printMagicSquare(int n);
void printMatrix(int n);
int main()
{
int n;
printf("请输入一个奇数:");
scanf_s("%d", &n);
printf("打印%d阶魔方阵为:\n",n);
printMagicSquare(n);
system("pause");
}
void printMagicSquare(int n)
{
//1、第一行的中间为1
int mid = n / 2;
matrix[0][mid] = 1;
//2、最后一行的中间数字为n^2,其右边为2
matrix[n - 1][mid] = n * n;
matrix[n - 1][mid + 1] = 2;
/*
3、从2开始,各数依次按如下规则存放:
①每个数的下一位在其右上方,即行数减1,列数加1,即[row-1][column+1]
②若当前数在第一行,则下一位在最后一行,列数同样加1,即[n-1][column+1]
③若当前数在最后一列,则下一位的列数为1,行数同样减1,即[row-1][0]
④若按照上述规则确定的位置上已经放置有数,或当前数在第一行最后一列,
即在[0][n-1],则下一位放在其下面,即[row+1][n-1]
*/
//由于n*n已经确定,因此只需要放置3~n*n-1
int finalNum = n * n - 1;
int curNumber = 3; //记录当前要填入的数字
int row = n - 1;
int column = mid + 1;
//当前2所在的位置是[n-1][mid+1]
while (curNumber <= finalNum)
{
//④若按照上述规则确定的位置上已经放置有数,或当前数在第一行最后一列,
//即在[0][n - 1],则下一位放在其下面,即[row + 1][n - 1]
if (row == 0 && column == n - 1)
{
row += 1;
matrix[row][column] = curNumber++;
}
//②若当前数在第一行,则下一位在最后一行, 列数同样加1,即[n - 1][column + 1]
else if (row == 0 && column!=n-1)
{
//考虑条件④
if (matrix[n-1][column+1] != 0)
{
row += 1;
//matrix[row][column] = curNumber++;
}
else
{
row = n - 1;
column += 1;
}
matrix[row][column] = curNumber++;
}
//③若当前数在最后一列,则下一位的列数为1,行数同样减1,即[row-1][0]
else if (column == n - 1 && row!=0)
{
//考虑条件④
if (matrix[row-1][0] != 0)
{
row += 1;
//matrix[row][column] = curNumber++;
}
else
{
row -= 1;
column = 0;
}
matrix[row][column] = curNumber++;
}
//①每个数的下一位在其右上方,即行数减1,列数加1,即[row-1][column+1]
else
{
//考虑条件④
if (matrix[row-1][column+1] != 0)
{
row += 1;
//matrix[row][column] = curNumber++;
}
else
{
row -= 1;
column += 1;
}
matrix[row][column] = curNumber++;
}
}
//打印矩阵
printMatrix(n);
}
void printMatrix(int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
printf("%d ", matrix[i][j]);
}
printf("\n");
}
}
运行结果:
-
3阶魔方阵:
-
5阶魔方阵
-
7阶魔方阵
欢迎友好的指正。