C语言实现奇数宫图算法详解及代码

奇数宫图是一种有趣的数字排列方式,它可以将1到n^2的数字排列在一个n行n列的矩阵中,其中n为奇数。在该矩阵中,数字的排列方式满足以下规则:

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

以下是C语言代码实现:

#include <stdio.h>
#define MAX_SIZE 15

int main() {
    int n;
    printf("请输入奇数宫的大小(3~%d):", MAX_SIZE);
    scanf("%d", &n);
    if (n % 2 == 0 || n < 3 || n > MAX_SIZE) {
        printf("输入错误!\n");
        return 0;
    }
    int magic[MAX_SIZE][MAX_SIZE] = {0}; // 初始化为0
    int row = n - 1, col = n / 2; // 初始位置
    int num = 1;
    while (num <= n * n) {
        magic[row][col] = num;
        num++;
        // 下一个位置
        int next_row = (row + 1) % n;
        int next_col = (col + 1) % n;
        if (magic[next_row][next_col] != 0) { // 位置被占,上方
            row = (row - 1 + n) % n;
        } else {
            row = next_row;
            col = next_col;
        }
    }
    // 输出
    printf("奇数宫如下:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%2d ", magic[i][j]);
        }
        printf("\n");
    }
    return 0;
}

代码分析:

  1. 首先根据用户输入的奇数n,创建一个n行n列的二维数组magic,并初始化为0。
  2. 初始位置为最后一行的中间,即row=n-1, col=n/2。
  3. 循环放数,直到放满n*n个数字。
  4. 每次放数字后,计算下一个位置next_row和next_col。
  5. 如果下一个位置被占了,就往上一行走(即row=(row-1+n)%n)。
  6. 否则就往左下方走(即row=next_row,col=next_col)。
  7. 循环结束后,输出二维数组magic即可。

注意:数组下标从0开始,因此行号和列号都要减1。

运行结果示例:

请输入奇数宫的大小(3~15):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 

参考资料:

  1. 纽约州立大学奥尔巴尼分校《计算机科学导论》课程资料。
  2. 《算法竞赛入门经典》第2版,李煜东等著,人民邮电出版社,2018年。
C语言实现奇数宫图算法详解及代码

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

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