You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

代码问题分析与修复

核心错误点

  1. 坐标混淆:矩阵行对应高度V,列对应宽度S,原代码把中心行poc_i赋值为s/2、中心列poc_j赋值为v/2,完全写反,导致初始位置错误。
  2. 循环终止条件错误:while (poc_i < v && poc_j < v)无法正确判断螺旋填充的边界,应该检查当前操作的坐标是否在矩阵合法范围内(行0v-1,列0s-1)。
  3. 方向逻辑混乱:原代码用ind%2控制方向,但螺旋需要按左→下→右→上的顺序循环四个方向,而非两组方向重复,方向控制逻辑完全错误。
  4. 填充步数错误:螺旋每圈的各边步数递增规律错误,且未覆盖四个完整方向,导致填充路径不符合要求。
  5. 未初始化数组:局部数组matrica未初始化,直接判断matrica[i][j] != x会触发未定义行为,应该先将整个矩阵填充为Y,再填充X。
  6. 越界风险:移动坐标时未判断是否超出矩阵边界,会导致数组越界访问。

修复后的代码

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 05:16:07