C语言如何在二维矩阵中查找4个垂直连续的1并返回首个坐标
实现逻辑说明与修正代码
现有代码问题
- 数组下标越界:原代码内层循环
j从width=6开始遍历,而数组列的合法下标范围是0~5,会访问非法内存 - 计数逻辑错误:原代码的
count全局统计所有1的数量,没有按列统计连续1的长度,也没有判断是否满足长度为4的要求
正确实现逻辑
因为要找垂直方向(同一列)的连续1序列,所以按以下步骤实现:
- 优先遍历所有列,每进入新的一列时,重置连续1的计数器为0
- 在当前列内逐行遍历判断:
- 如果当前位置值为1,计数器加1,当计数器刚好等于4时,说明从当前行往前数3行的位置,就是长度为4的连续1序列的首个元素,直接输出对应坐标即可
- 如果当前位置值不为1,直接重置计数器为0
修正后代码
#include <stdio.h> #include <stdlib.h> int length = 5, width = 6; int main() { int arr[5][6] = { { 1, 1, 8, 4, 1, 1 }, { 7, 1, 2, 6, 1, 8 }, { 7, 1, 2, 4 , 1, 4 }, { 7, 1, 6, 2, 1, 8 }, { 0, 0, 3, 3, 6, 6 }, }; // 遍历每一列 for (int j = 0; j < width; j++) { int consecutive = 0; // 遍历当前列的每一行 for (int i = 0; i < length; i++) { if (arr[i][j] == 1) { consecutive++; // 连续长度刚好为4时输出首坐标 if (consecutive == 4) { printf("arr[%d][%d]\n", i - 3, j); } } else { // 遇到非1重置计数 consecutive = 0; } } } return 0; }
运行输出结果
arr[0][1] arr[0][4]
内容的提问来源于stack exchange,提问作者Mn Nm
相关产品推荐
相关产品推荐

