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

