【发布时间】: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