Recursion 识别二维数组中的连续重复[C]

Recursion 识别二维数组中的连续重复[C],recursion,multidimensional-array,backtracking,contiguous,Recursion,Multidimensional Array,Backtracking,Contiguous,我有一个二维数组,看起来像这样: 1 1 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 0 1 1 0 0 1 1 1 我试图找出一种方法来识别1的最长连续链,要么穿过,要么向下。在本例中,它从第4列第2行开始,长度为4,向下 我曾考虑使用递归,但在跟踪位置时遇到了一些问题,尤其是遇到0时 到目前为止,我有一些类似的东西(仅供检查): main(){ ... 对于(i=0;i

我有一个二维数组,看起来像这样:

1 1 0 0 1
1 0 1 1 0
0 0 1 1 0
1 1 0 1 1
0 0 1 1 1
我试图找出一种方法来识别1的最长连续链,要么穿过,要么向下。在本例中,它从第4列第2行开始,长度为4,向下

我曾考虑使用递归,但在跟踪位置时遇到了一些问题,尤其是遇到0时

到目前为止,我有一些类似的东西(仅供检查):

main(){
...
对于(i=0;i=n | | j<0 | | j>=n)返回;//在网格之外
如果(G[i][j]==0)返回;//遇到0
G[i][j]=字数+1;
交叉检查(i,j+1,n);
}
其中,
G[][]
是包含1和0的二维数组,
n
是行/列数,
i
是行号,
j
是列数


提前感谢您的帮助

您当前的答案需要O(n3)个时间;要计算一条直线,请检查每个可能的起始位置和结束位置(每个都有O(n)个可能性),共有n条直线

您的算法是正确的,但让我们看看是否可以改进运行时间

如果我们将问题分解为更简单的问题,例如“在这个一维数组中,最长的1连续链是什么?”,那么问题可能会变得更简单。如果我们求解它
2n次,那么我们就得到了答案,所以我们只需要把这个问题降到小于O(n2)的水平,以便改进

好的,我们可以简单地穿过这条线,记住最长的1序列的位置(开始和结束)和长度。这需要O(n)个时间,并且是最优的(如果序列都是1s或0s,我们必须读取每个元素以知道最长序列的开始/结束位置)


然后,我们可以简单地在O(n2)时间内为每一行和每一列求解此问题。

创建一个名为V的新n×n矩阵。这将为每个单元格存储该单元格及其正上方的1数。这将是O(n^2)

checkAllVertical(int n){
V=malloc(..)//创建V,一个初始化为零的n×n矩阵

对于(intr=0;rIf),如果您想坚持使用自己的解决方案,只需交换索引,就可以轻松地交换行和列,您的实现就完成了。
main() {
    ...
    for(i = 0; i < n; i++)
      for(j = 0; j < n; j++)
        if (G[i][j] == 1) {
          CheckAcross(i, j, n);
        }
    ...
}

void CheckAcross (int i, int j, int n) {
     if (i < 0 || i >= n || j < 0 || j >= n) return; // outside of grid
     if (G[i][j] == 0 ) return; //0 encountered
     G[i][j] = WordCount + 1;
     CheckAcross(i, j + 1, n);

}
checkAllVertical(int n) {
    V = malloc(....) // create V, an n-by-n matrix initialized to zero
    for(int r=0; r<n; r++) {
      for(int c=0; c<n; c++) {
        if(G[r][c]=1) {
          if(r==0)
            V[r][c] = 1;
          else
            V[r][c] = 1 + V[r][c];
        }
      }
    }
}