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

C语言二维数组行列相邻相等元素检测函数调试求助

解决二维数组列方向相邻元素检测问题

看起来你已经搞定了行方向的相邻元素检测,但列方向的逻辑还没捋顺对吧?我来帮你梳理一下问题,再给出完整的解决方案。

首先先补全你现有的行检测函数(看你的代码应该是笔误漏了部分内容,我帮你修正了越界问题):

// 检测一维数组中是否存在相邻相等元素
int adjArray(int arr[], int size) { 
    int flag = 0; 
    // 循环到size-1,避免arr[i+1]越界
    for(int i = 0; i < size - 1; i++){ 
        if(arr[i] == arr[i+1]){
            flag = 1;
            break;
        }
    }
    return flag;
}

这个函数处理行方向没问题,但二维数组的列检测需要换个遍历思路——固定列,逐行比较上下相邻的元素,而不是像行检测那样固定行逐列比较。

下面是包含行、列方向完整检测的函数:

// 检测二维整数数组中是否存在有效玩法(行/列相邻相等元素≥2)
int hasValidMove(int **arr, int rows, int cols) {
    // 先检测行方向:遍历每一行,复用你的adjArray函数
    for (int i = 0; i < rows; i++) {
        if (adjArray(arr[i], cols)) {
            return 1; // 找到有效玩法,直接返回,不用继续遍历
        }
    }

    // 再检测列方向:固定列,逐行比较上下元素
    for (int j = 0; j < cols; j++) { // 遍历每一列
        // 遍历到rows-1,避免i+1越界访问
        for (int i = 0; i < rows - 1; i++) { 
            if (arr[i][j] == arr[i+1][j]) {
                return 1; // 找到上下相邻相等元素,返回有效
            }
        }
    }

    // 行和列都没有符合条件的相邻元素
    return 0;
}

关键逻辑说明

  • 列检测的核心是按列遍历:先锁定第j列,然后从第0行到第rows-2行,依次比较当前行i和下一行i+1的第j列元素是否相等。
  • 循环边界一定要注意:不管行还是列检测,都要避免数组越界,所以行方向循环到size-1,列方向循环到rows-1。
  • 一旦找到符合条件的相邻元素就立即返回,不用继续遍历整个数组,这样能提升检测效率。

如果你的二维数组不是用指针数组(int**)存储的,而是用静态二维数组(比如int arr[5][5]),可以把函数参数改成int arr[][cols], int rows, int cols(C99及以上支持变长数组),或者调整成适配静态数组的遍历方式,逻辑是完全一致的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:29:50