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

如何在C语言中按指定规则回溯二维数组并记录行号?

C语言二维数组回溯实现方案

输入问题修正

先解决你代码里重复输入n1、未输入n2的问题:只保留一次n1的输入逻辑,新增n2的输入步骤即可。

完整实现代码

#include <stdio.h>
#include <stdlib.h>

int main() {
    int x, y, n1, n2;
    // 输入二维数组的行列数
    printf("请输入二维数组的行数x和列数y: ");
    scanf("%d %d", &x, &y);

    // 修正输入逻辑:仅读取一次n1,新增n2输入
    printf("请输入向上移动的步长n1: ");
    scanf("%d", &n1);
    printf("请输入向左移动的步长n2: ");
    scanf("%d", &n2);

    // 动态分配二维数组内存
    int **arr = (int **)malloc(x * sizeof(int *));
    for (int i = 0; i < x; i++) {
        arr[i] = (int *)malloc(y * sizeof(int));
        // 示例初始化:按行填充连续数值
        for (int j = 0; j < y; j++) {
            arr[i][j] = i * y + j;
        }
    }

    // 输出生成的二维数组
    printf("生成的二维数组:\n");
    for (int i = 0; i < x; i++) {
        for (int j = 0; j < y; j++) {
            printf("%3d ", arr[i][j]);
        }
        printf("\n");
    }

    // 回溯核心逻辑实现
    int current_row = x - 1; // 起点为右下角,行下标为x-1(数组下标从0开始)
    int current_col = y - 1; // 起点列下标为y-1
    int track[100]; // 预设最大存储100步,可按需调整大小
    int track_idx = 0;

    // 先存入起点的行号
    track[track_idx++] = current_row;

    while (1) {
        // 到达左上角,直接退出循环
        if (current_row == 0 && current_col == 0) {
            break;
        }

        // 第一步:向上移动n1个单位
        current_row -= n1;
        if (current_row < 0) current_row = 0; // 防止行号越界
        track[track_idx++] = current_row;

        // 移动后已到终点,无需继续向左
        if (current_row == 0 && current_col == 0) {
            break;
        }

        // 第二步:向左移动n2个单位
        current_col -= n2;
        if (current_col < 0) current_col = 0; // 防止列号越界
        track[track_idx++] = current_row;

        // 再次判断是否到达终点
        if (current_row == 0 && current_col == 0) {
            break;
        }
    }

    // 打印track数组内容
    printf("\n回溯路径的行号track数组:\n");
    for (int i = 0; i < track_idx; i++) {
        printf("%d ", track[i]);
    }
    printf("\n");

    // 释放动态分配的内存,避免泄漏
    for (int i = 0; i < x; i++) {
        free(arr[i]);
    }
    free(arr);

    return 0;
}

关键逻辑说明

  • 下标边界处理:C语言数组下标从0开始,所以右下角元素的行号是x-1、列号是y-1,直接用x/y会导致数组越界。
  • 越界保护:向上/向左移动时,若计算后的行/列号小于0,直接置为0,避免非法内存访问。
  • track数组存储规则:每次移动(包括起点)都将当前行号存入数组,到达左上角arr[0][0]时立即终止回溯。
  • 内存管理:动态分配的二维数组需要逐层释放,避免内存泄漏。

内容的提问来源于stack exchange,提问作者code10110

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:35:23