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

C语言二维数组控制机器人收集1并统计遗漏数量问题求解

问题修正方案

现有代码存在以下核心问题:

  • 变量命名冲突:存储全局总行列数的row、col变量,在后续逐行统计时被用作循环变量,原始的总行列数值被覆盖,导致数组访问逻辑完全混乱
  • 行内1的索引查找逻辑错误:sum==1分支中直接使用全局的i、j变量,没有遍历当前行来定位1的具体位置
  • 缺少最优路径计算逻辑:仅统计每行1的数量无法得到最优收集结果,机器人的移动受上一行位置限制,必须通过动态规划记录每一个位置的最大收集量
  • 缺少总1数统计逻辑:遗漏的1总数 = 全局所有1的总数量 - 最优路径可收集的最大1数量,现有代码没有统计全局总1数
修正后完整代码
#include <stdio.h>
#include <stdlib.h>
// Windows系统请替换为 #include <windows.h>
#include <unistd.h>

#define MAX(a,b) ((a) > (b) ? (a) : (b))

int main()
{
    int missed_rocket;  // 最终遗漏的1的总数
    int total_rocket = 0; // 全局所有1的总数
    int best_collect = 0; // 最优路径最多收集的1数量
    int i, j;
    int row, col;       // 全局总行数、列数
    FILE* ex1 = fopen("ex1.be", "r");
    if (ex1 == NULL) {
        printf("文件打开失败,请检查ex1.be是否在同级目录\n");
        return 1;
    }
    fscanf(ex1, "%d %d", &row, &col);    // 读取总行列数
    int matrix[row][col];   // 存储矩阵
    // 读取矩阵同时统计总1数量
    for (i = 0; i < row; i++) {
        for (j = 0; j < col; j++) {
            fscanf(ex1, "%d", &matrix[i][j]);
            if (matrix[i][j] == 1) {
                total_rocket++;
            }
        }
    }
    // 打印矩阵 自测用可删除
    for (i = 0; i < row; i++) {
        for (j = 0; j < col; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    // 确定起始位置
    int start_col = 0;
    for (j = 0; j < col; j++) {
        if (matrix[0][j] == 1) {
            start_col = j;
            break;
        }
    }
    // 初始化DP数组,dp[i][j]代表走到第i行第j列最多收集的1数量
    int dp[row][col];
    // 第一行DP值初始化
    for (j = 0; j < col; j++) {
        dp[0][j] = (j == start_col) ? matrix[0][j] : -1; // 第一行只有起始位置可达
    }
    // 逐行计算DP值
    for (i = 1; i < row; i++) {
        // 先全部初始化为不可达
        for (j = 0; j < col; j++) {
            dp[i][j] = -1;
        }
        for (j = 0; j < col; j++) {
            int prev_max = -1;
            // 检查上一行j-1、j、j+1三个位置,取最大值
            if (j-1 >= 0 && dp[i-1][j-1] > prev_max) prev_max = dp[i-1][j-1];
            if (dp[i-1][j] > prev_max) prev_max = dp[i-1][j];
            if (j+1 < col && dp[i-1][j+1] > prev_max) prev_max = dp[i-1][j+1];
            // 上一行有可达位置,当前位置才可达
            if (prev_max != -1) {
                dp[i][j] = prev_max + matrix[i][j];
            }
        }
    }
    // 找最后一行的最大值,就是最优收集数
    for (j = 0; j < col; j++) {
        if (dp[row-1][j] > best_collect) {
            best_collect = dp[row-1][j];
        }
    }
    // 计算遗漏数量
    missed_rocket = total_rocket - best_collect;
    printf("最优路径收集数量:%d,总1数量:%d,遗漏数量:%d\n", best_collect, total_rocket, missed_rocket);

    sleep(10);
    return 0;
}
逻辑验证

针对你提供的输入样例,总1的数量是12,最优路径最多收集8个,最终遗漏数量为4,你可以直接运行验证结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:54:09