C语言实现奇数宫图算法:生成魔方阵

宫图,就是将 1 到 n*n 的数字放入方阵,使得横竖斜之和都相等。本题要求按以下算法显示奇数宫图

  1. 先将 1 放入最后一行的中间
  2. 寻找下一个位置:下一个是刚刚那个位置的左下方(如果越下界换到最上,如果越左界换到最右),如果这个位置被占,下一个位置是原来位置的上方
  3. 循环第二步,直到放完。正奇数 n,以 0 结束。

要求每行的数字之间有空格,但最后的数字后面没有。

C语言内容:实现如下:

#include <stdio.h>

#define MAX_N 101 // 最大n值

int n; // 方阵大小
int a[MAX_N][MAX_N]; // 存放宫图的数组

void magicSquare()
{
    int i, j, k;

    // 初始化数组
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            a[i][j] = 0;
        }
    }

    // 将1放入最后一行的中间
    i = n - 1;
    j = n / 2;
    a[i][j] = 1;

    // 寻找下一个位置
    for (k = 2; k <= n * n; k++) {
        i = (i + 1) % n;
        j = (j + 1) % n;
        if (a[i][j] != 0) {
            i = (i - 1 + n) % n;
            j = (j - 1 + n) % n;
            i = (i - 1 + n) % n;
        }
        a[i][j] = k;
    }
}

int main()
{
    scanf('%d', &n);

    if (n % 2 == 0) {
        printf('n必须是奇数\n');
        return 0;
    }

    magicSquare();

    // 输出宫图
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf('%d ', a[i][j]);
        }
        printf('\n');
    }

    return 0;
}

代码解释:

  1. magicSquare() 函数

    • 初始化数组 a,将其所有元素置为 0。
    • 将 1 放入最后一行的中间位置。
    • 使用循环从 2 到 n*n,依次寻找下一个位置并填入数字。
    • 寻找下一个位置的规则如下:
      • 首先尝试将当前位置的左下方位置填入数字。
      • 如果左下方位置超出边界,则将位置换到最上或最右。
      • 如果左下方位置已经被占,则将位置换到当前位置的上方。
  2. main() 函数

    • 从用户输入读取 n 的值。
    • 检查 n 是否为奇数,如果不是,则输出错误信息并退出。
    • 调用 magicSquare() 函数生成宫图。
    • 输出生成的宫图。

示例:

输入:

5

输出:

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 
C语言实现奇数宫图算法:生成魔方阵

原文地址: https://www.cveoy.top/t/topic/oOM9 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录