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
相关产品推荐
相关产品推荐

