当前位置: 首页 > 知识库问答 >
问题:

在矩阵中查找区域的递归函数

左丘智渊
2023-03-14

给定一个NxN矩阵(包含布尔值-true/false)。我们将定义:

  • 数组中的真实区域,作为所有具有真实值的相邻单元格的最大集合。
  • 相互对角定位的单元格不被认为是相邻的。

在本例中,有3个真实区域:真实区域

我的解决方案在Java中尝试:

java prettyprint-override">public static int (boolean[][] mat) {
        return GetTrueRegions(mat, 0, 0);
    }
    public static int GetTrueRegions(boolean[][] m, int i , int j) {
        final boolean VISITED = false;
        if (i == m.length - 1 && j == m[0].length - 1)
            return 0;

        // avoid repeat a cell
        boolean temp = m[i][j];
        m[i][j] = VISITED;

        // recursion for all neighbors
        int up = -1, down = -1, left = -1, right = -1;
        if (i - 1 >= 0 && m[i-1][j] )
            up = GetTrueRegions(m, i - 1, j);
        if (i + 1 < m.length && m[i+1][j])
            down = GetTrueRegions(m, i + 1, j);
        if (j - 1 >= 0 && m[i][j-1])
            left = GetTrueRegions(m, i, j - 1);
        if (j + 1 < m[0].length && m[i][j+1] )
            right = GetTrueRegions(m, i, j + 1);
        // couldn't find a path
        if (temp) {
            return 1 + GetTrueRegions(m, i, j + 1);
        }
        if (up == -1 && down == -1 && left == -1 && right == -1 )
            return GetTrueRegions(m, i, j +1);

        return up + down + left + right;
    }

这显然不起作用。

我在考虑遍历每个单元格,如果该单元格有真值,则在总区域(不知何故)中加1,然后将该值设为假,并将该值设为假(将该区域标记为“已访问”)。

虽然我发现很难获得基本情况,以及如何获得每个区域的值。

共有1个答案

卜盛
2023-03-14

试着这样看:

public static int GetTrueRegions(boolean[][] mat)
{
    return GetTrueRegions(mat, 0, 0);
}

private static int GetTrueRegions(boolean[][] m, int i, int j)
{
    if (j == m[0].length)
        return 0;       
        
    if (i == m.length)
        return GetTrueRegions(m, 0, j + 1);     

    // found a region 
    if (m[i][j])
    {
        // mark the entire region, to avoid duplications
        markRegionAsFalse(m, i, j);
        
        // count 1 region and proceed
        return 1 + GetTrueRegions(m, i + 1, j);
    }
    
    // proceed... 
    return GetTrueRegions(m, i + 1, j);
}

private static void markRegionAsFalse(boolean[][] matrix, int row, int col)
{
    // just visited...
    matrix[row][col] = false;
    
    if(row - 1 >= 0 && matrix[row - 1][col]) // move up and mark cell if true
        markRegionAsFalse(matrix, row - 1, col);
    
    if (row < matrix.length - 1 && matrix[row + 1][col]) // move down and mark cell if true
        markRegionAsFalse(matrix, row + 1, col);
    
    if (col < matrix.length - 1 && matrix[row][col + 1]) // move right and mark cell if true
        markRegionAsFalse(matrix, row, col + 1);
    
    if(col - 1 >= 0 && matrix[row][col - 1]) // move left and mark cell if true
        markRegionAsFalse(matrix, row, col - 1);            
}
 类似资料:
  • 问题内容: 我正在尝试编写一种算法,用于在给定的子矩阵中查找子矩阵。为了解决这个问题,我编写了以下代码: 这段代码可以正常工作,但是我不确定这是问题的确切解决方案还是可以解决。请提供您的专家意见。提前致谢。 问题答案: 该算法对4×4矩阵和2×2子矩阵进行了硬编码。否则,它看起来像蛮力算法。 我会这样表示: 如果您想要更有效的方法,建议您将它们压扁,如下所示: 并在此序列中搜索以下模式: 使用标准

  • 问题内容: 可以说我有下表 基本上,要求是将所有经理拉到您要搜索的user_id下。因此,例如,如果我发送“ Linda”,则它应该返回我: 或者,如果我发送“ Mark”,那么它应该返回我: 我听说过递归函数,但不确定如何执行。任何帮助,将不胜感激。 问题答案: 使用: 结果集: 脚本:

  • 题目描述 在一个m行n列二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字6,则返回true;如果查找数字5,由于数组不含有该数字,则返回false。 分析与解法 解法一、分治法 这种行和列分别递增的矩阵,有一个专有名词

  • 在一个m行n列二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 使用Step-wise线性搜索。 def get_value(l, r, c): return l[r][c] def find(l, x): m = len(l) - 1 n = len(l[0]) - 1

  • 我正在尝试编写一个递归方法,它可以找到一个路径,而不需要回溯到一个int矩阵中的一个位置,这个矩阵包含值0,1。0可以踩,1不行。我也限制了一条超过50步的路径。 Location是一个具有行和列值(x,y)的对象。locationEquals是一个函数,如果两个位置相同,则返回true,否则返回false。map变量是我试图在其中找到路径的矩阵。 执行以下代码后'选项'为空,这意味着它没有找到方

  • 我的角度控制器中有两个函数,分别是loadForm和SaveForm。我想找出我的表单数组和我的新数组之间的差异。所以我使用了object Diff插件。这是我的数组预览,这是我的DiffObject结果预览:已更改数组 我必须通过递归函数只保存对象更改值。将值放入新数组。