C语言实现奇数宫图算法详解及代码
C语言实现奇数宫图算法详解及代码
奇数宫图是一种有趣的数字排列方式,它可以将1到n^2的数字排列在一个n行n列的矩阵中,其中n为奇数。在该矩阵中,数字的排列方式满足以下规则:
- 先将1放入最后一行的中间
- 寻找下一个位置:下一个是刚刚那个位置的左下方(如果越下界换到最上,如果越左界换到最右),如果这个位置被占,下一个位置是原来位置的上方
- 循环第二步,直到放完
以下是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;
}
代码分析:
- 首先根据用户输入的奇数n,创建一个n行n列的二维数组magic,并初始化为0。
- 初始位置为最后一行的中间,即row=n-1, col=n/2。
- 循环放数,直到放满n*n个数字。
- 每次放数字后,计算下一个位置next_row和next_col。
- 如果下一个位置被占了,就往上一行走(即row=(row-1+n)%n)。
- 否则就往左下方走(即row=next_row,col=next_col)。
- 循环结束后,输出二维数组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
参考资料:
- 纽约州立大学奥尔巴尼分校《计算机科学导论》课程资料。
- 《算法竞赛入门经典》第2版,李煜东等著,人民邮电出版社,2018年。
原文地址: https://www.cveoy.top/t/topic/oONr 著作权归作者所有。请勿转载和采集!