【问题标题】:Recursive Function to find regions in matrix递归函数在矩阵中查找区域
【发布时间】:2021-04-10 11:58:14
【问题描述】:

给定一个NxN 矩阵(其中包含布尔值 - 真/假)。 我们将定义:

  • 数组中的真实区域作为所有具有真实值的相邻单元格的最大集合。
  • 对角线位置的单元格不被视为相邻。

在此示例中,有 3 个真实区域: True Regions

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

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 加到总区域(不知何故),并将值假给他和每个相邻的单元格(将该区域标记为“已访问” )。

虽然我发现很难获得基本案例,以及如何获得每个地区的价值。

【问题讨论】:

  • 这是一个众所周知的计数number of islands 问题。您将收到的二维矩阵如何作为输入?
  • 感谢您的评论,我找到了解决方案,我只需要检查并标记辅助函数中的相邻单元格。

标签: java algorithm recursion computer-science backtracking


【解决方案1】:

试着看看类似的东西:

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);            
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 2015-12-20
    • 2014-04-22
    • 1970-01-01
    • 2016-06-13
    相关资源
    最近更新 更多