C语言螺旋矩阵填充问题求助:按指定规则填充遇测试异常
C语言螺旋填充矩阵代码问题排查
功能需求
- 用户输入矩阵宽度
S、高度V(≤100)及整数X、Y - 矩阵中心
[S/2, V/2](允许偏差1)填充X,之后按左→下→右→上的螺旋方式填充X,其余位置填Y - 示例输出矩阵:
6 6 6 6 6 6 6 6 4 4 4 4 4 4 4 4 6 4 4 6 6 6 6 6 4 6 4 4 6 4 4 4 6 4 6 4 4 6 4 6 6 6 4 6 4 4 6 4 4 4 4 4 6 4 4 6 6 6 6 6 6 6 4
用户提供的问题代码
#include <stdio.h> int main() { int matrica[100][100], i, j, s, v, x, y; printf("Unesite sirinu i visinu matrice: "); scanf("%d%d", &s, &v); printf("Unesite X i Y: "); scanf("%d%d", &x, &y); int br = 2; int poc_i = s / 2; int poc_j = v / 2; int ind = 1; while (poc_i < v && poc_j < v) { for (int i = 0; i < br; i++) { matrica[poc_i][poc_j] = x; if (ind % 2 != 0) { poc_j--; } else { poc_j++; } } for (int i = 0; i < br; i++) { matrica[poc_i][poc_j] = x; if (ind % 2 != 0) { poc_i++; } else { poc_i--; } } br += 2; ind++; } for (int i = 0; i < s; i++) { for (int j = 0; j < v; j++) { if (matrica[i][j] != x) { matrica[i][j] = y; } } } for (i = 0; i < v; i++) { for (j = 0; j < s; j++) printf("%5d", matrica[i][j]); printf("\n"); } return 0; }
代码问题分析与修复
核心错误点
- 坐标混淆:矩阵行对应高度
V,列对应宽度S,原代码把中心行poc_i赋值为s/2、中心列poc_j赋值为v/2,完全写反,导致初始位置错误。 - 循环终止条件错误:
while (poc_i < v && poc_j < v)无法正确判断螺旋填充的边界,应该检查当前操作的坐标是否在矩阵合法范围内(行0v-1,列0s-1)。 - 方向逻辑混乱:原代码用
ind%2控制方向,但螺旋需要按左→下→右→上的顺序循环四个方向,而非两组方向重复,方向控制逻辑完全错误。 - 填充步数错误:螺旋每圈的各边步数递增规律错误,且未覆盖四个完整方向,导致填充路径不符合要求。
- 未初始化数组:局部数组
matrica未初始化,直接判断matrica[i][j] != x会触发未定义行为,应该先将整个矩阵填充为Y,再填充X。 - 越界风险:移动坐标时未判断是否超出矩阵边界,会导致数组越界访问。
修复后的代码
#include <stdio.h> int main() { int matrica[100][100], i, j, s, v, x, y; printf("Unesite sirinu i visinu matrice: "); scanf("%d%d", &s, &v); printf("Unesite X i Y: "); scanf("%d%d", &x, &y); // 先将整个矩阵填充为Y for (i = 0; i < v; i++) { for (j = 0; j < s; j++) { matrica[i][j] = y; } } // 初始化中心坐标:行是v/2,列是s/2 int curr_row = v / 2; int curr_col = s / 2; matrica[curr_row][curr_col] = x; // 螺旋步数:初始每边步数为1,每完成两轮(左+下/右+上)步数加1 int step = 1; // 方向:0=左,1=下,2=右,3=上 int dir = 0; while (1) { int filled = 0; // 按当前方向走step步 for (int k = 0; k < step; k++) { switch (dir) { case 0: curr_col--; break; // 左 case 1: curr_row++; break; // 下 case 2: curr_col++; break; // 右 case 3: curr_row--; break; // 上 } // 检查坐标是否在矩阵范围内 if (curr_row >= 0 && curr_row < v && curr_col >=0 && curr_col < s) { matrica[curr_row][curr_col] = x; filled = 1; } else { // 越界则回退并退出循环 switch (dir) { case 0: curr_col++; break; case 1: curr_row--; break; case 2: curr_col--; break; case 3: curr_row++; break; } break; } } if (!filled) break; // 没有填充任何元素,说明已经到边界,结束循环 // 切换方向 dir = (dir + 1) % 4; // 每完成两个方向(左+下、右+上),步数加1 if (dir == 2 || dir == 0) { step++; } } // 输出矩阵 for (i = 0; i < v; i++) { for (j = 0; j < s; j++) { printf("%5d", matrica[i][j]); } printf("\n"); } return 0; }
内容的提问来源于stack exchange,提问作者tomanthony
相关产品推荐
相关产品推荐

