【无标题】

生成奇数阶幻方矩阵。所谓的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;
        }
    }
}	         	 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值