C语言实现奇数宫图算法:生成魔方阵
C语言实现奇数宫图算法:生成魔方阵
宫图,就是将 1 到 n*n 的数字放入方阵,使得横竖斜之和都相等。本题要求按以下算法显示奇数宫图
- 先将 1 放入最后一行的中间
- 寻找下一个位置:下一个是刚刚那个位置的左下方(如果越下界换到最上,如果越左界换到最右),如果这个位置被占,下一个位置是原来位置的上方
- 循环第二步,直到放完。正奇数 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;
}
代码解释:
-
magicSquare()函数:- 初始化数组
a,将其所有元素置为 0。 - 将 1 放入最后一行的中间位置。
- 使用循环从 2 到 n*n,依次寻找下一个位置并填入数字。
- 寻找下一个位置的规则如下:
- 首先尝试将当前位置的左下方位置填入数字。
- 如果左下方位置超出边界,则将位置换到最上或最右。
- 如果左下方位置已经被占,则将位置换到当前位置的上方。
- 初始化数组
-
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
原文地址: https://www.cveoy.top/t/topic/oOM9 著作权归作者所有。请勿转载和采集!