题解 | 蛇形矩阵
蛇形矩阵
https://www.nowcoder.com/practice/f228a074c5274619b26be544962375e1
2026年2月18日21:50:32,豆包提供的题解,提交通过
#include <stdio.h>
// 定义最大矩阵尺寸(满足n<=1000的要求)
#define MAX_SIZE 1000
int main() {
int n;
// 读取输入的整数n
scanf("%d", &n);
// 初始化n×n的矩阵,静态数组满足1000×1000的规模要求
int matrix[MAX_SIZE][MAX_SIZE] = {0};
int num = 1; // 要填充的初始数字
// 遍历所有对角线的和s(i+j,范围0到2*(n-1))
for (int s = 0; s < 2 * n - 1; s++) {
int start_i, end_i;
// 确定当前对角线i的起始和结束范围
if (s <= n - 1) {
start_i = 0;
end_i = s;
} else {
start_i = s - (n - 1);
end_i = n - 1;
}
// 偶数和的对角线:从下往上填充(i递减)
if (s % 2 == 0) {
for (int i = end_i; i >= start_i; i--) {
int j = s - i;
matrix[i][j] = num++;
}
}
// 奇数和的对角线:从上往下填充(i递增)
else {
for (int i = start_i; i <= end_i; i++) {
int j = s - i;
matrix[i][j] = num++;
}
}
}
// 输出矩阵,每行元素用空格分隔
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
// 最后一个元素后不加多余空格(可选优化,兼容题目要求)
if (j == n - 1) {
printf("%d\n", matrix[i][j]);
} else {
printf("%d ", matrix[i][j]);
}
}
}
return 0;
}
代码关键解释
- 数组定义:用#define MAX_SIZE 1000限定最大矩阵尺寸,静态二维数组int matrix[MAX_SIZE][MAX_SIZE]满足 n≤1000 的需求(1000×1000 的 int 数组占用约 4MB 内存,完全符合 C 语言运行环境的内存限制)。
- 对角线遍历逻辑:核心依然是按i+j的和s遍历所有对角线,s的范围是0 ~ 2*(n-1)(矩阵右下角位置(n-1,n-1)的s = 2n-2)。根据s是否超过n-1,确定每行 i 的起始 / 结束值:s ≤ n-1:对角线从左上角延伸,i 从 0 到 s;s > n-1:对角线触达矩阵边缘,i 从s-(n-1)到n-1。
- 填充方向控制:偶数s:用for (int i = end_i; i >= start_i; i--)从下往上填充;奇数s:用for (int i = start_i; i <= end_i; i++)从上往下填充。
- 输出优化:输出时判断j == n-1,避免每行末尾出现多余空格(部分 OJ 平台对末尾空格敏感,此写法更通用)。
测试示例(输入 4)
编译运行代码后输入4,输出结果与示例完全一致:
plaintext
1 2 6 7 3 5 8 13 4 9 12 14 10 11 15 16
总结
- C 语言实现的核心逻辑与 Python 一致,关键是通过静态二维数组适配矩阵存储,用 C 语言的循环语法实现对角线遍历和方向控制。
- 算法时间复杂度为
O(n²),对于 n=1000 的场景,C 语言执行效率极高,无性能问题。 - 输出时的空格处理是细节优化,确保符合大多数编程题目的格式要求,避免因格式问题判错。
文远知行公司福利 588人发布