编辑代码

#include <stdio.h>
#include <stdbool.h>

#define N 5 // 定义幻方矩阵的大小,这里以3x3为例

// 函数声明
bool isMagicSquare(int matrix[N][N]);
void printMatrix(int matrix[N][N]);

int main() {
    // 3x3幻方矩阵的例子
    int magicSquare[N][N] = {
        {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},
    };

    // 检验幻方矩阵
    if (isMagicSquare(magicSquare)) {
        printf("这是一个幻方矩阵。\n");
        printMatrix(magicSquare); // 打印幻方矩阵
    } else {
        printf("这不是一个幻方矩阵。\n");
    }

    return 0;
}

// 检验是否为幻方矩阵
bool isMagicSquare(int matrix[N][N]) {
    int sum = 0; // 用于存储每行、每列和对角线的和
    int i, j;

    // 计算第一行的和
    for (i = 0; i < N; i++) {
        sum += matrix[0][i];
    }

    // 检查每一行的和是否等于sum
    for (i = 1; i < N; i++) {
        int rowSum = 0;
        for (j = 0; j < N; j++) {
            rowSum += matrix[i][j];
        }
        if (rowSum != sum) {
            return false;
        }
    }

    // 检查每一列的和是否等于sum
    for (j = 1; j < N; j++) {
        int colSum = 0;
        for (i = 0; i < N; i++) {
            colSum += matrix[i][j];
        }
        if (colSum != sum) {
            return false;
        }
    }

    // 检查主对角线的和是否等于sum
    int diagSum1 = 0;
    for (i = 0; i < N; i++) {
        diagSum1 += matrix[i][i];
    }

    // 检查副对角线的和是否等于sum
    int diagSum2 = 0;
    for (i = 0; i < N; i++) {
        diagSum2 += matrix[i][N - 1 - i];
    }

    // 如果所有和都相等,则为幻方矩阵
    return (diagSum1 == sum) && (diagSum2 == sum);
}

// 打印矩阵
void printMatrix(int matrix[N][N]) {
    int i, j;
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
}