生成奇数阶幻方矩阵。所谓的n阶魔方矩阵是指把1~n×n的自然数按一定方法排列成n×n的矩阵,使得任意行、任意列以及两个对角线上的数字之和都相等(已知n为奇数,假设n不超过15)。请编写一个程序,实现奇数阶魔方矩阵的生成。
先输入矩阵的阶数n(假设 n<=15),然后生成并输出n×n阶幻方矩阵。
输入数据提示信息:“Input n:”
输入数据格式:“%d”
输出数据提示信息和格式:“%d*%d magic square:\n”
程序运行示例:
Input n:5↙
5*5 magic square:
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
#include <stdio.h>
#define N 15
void InitializerMatrix(int x[][N], int n);
void PrintMatrix(int x[][N], int n);
void GenerateMagicSquare(int x[][N], int n);
int main(void)
{
int matrix[N][N], n;
printf("Input n:");
scanf("%d", &n);
InitializerMatrix(matrix, n);
GenerateMagicSquare(matrix, n);
printf("%d*%d magic square:\n", n, n);
PrintMatrix(matrix, n);
return 0;
}
//函数功能:生成n阶幻方矩阵
void GenerateMagicSquare(int x[][N], int n)
{
int i, r, c, row, col;
//第1步:定位1的初始位置
row = 0;
col = (n - 1) / 2;
x[row][col] = 1;
//第2步:将第i个数(i从2到N*N)依次放到合适的位置上
for (i = 2; i <= n * n; ++i)
{
r = row; //记录前一个数的行坐标
c = col; //记录前一个数的列坐标
row = (row - 1 + n) % n; //计算第i个数要放置的行坐标
col = (col + 1) % n; //计算第i个数要放置的列坐标
if (x[row][col] == 0) //该处无数(未被占用),则放入该数
{
x[row][col] = i;
}
else //该处有数(已占用),则放到前一个数的下一行
{
r = (r + 1) % n;
x[r][c] = i;
row = r;
col = c;
}
}
}
//函数功能:输出n阶幻方矩阵
void PrintMatrix(int x[][N], int n)
{
int i, j;
for (i = 0; i < n; ++i)
{
for (j = 0; j < n; ++j)
{
printf("%4d", x[i][j]);
}
printf("\n");
}
}
//函数功能:初始化数组元素全为0,标志数组元素未被占用
void InitializerMatrix(int x[][N], int n)
{
int i, j;
for (i = 0; i < n; ++i)
{
for (j = 0; j < n; ++j)
{
x[i][j] = 0;
}
}
}