LintCode 섬의 개수
1390 단어 LintCode
01 행렬을 주어 서로 다른 섬의 개수를 구하다.
0은 바다를 대표하고, 1은 섬을 대표하며, 만약 두 개의 1이 서로 인접한다면 이 두 개의 1은 같은 섬에 속한다.우리는 상하좌우를 인접으로만 고려한다.
예제
행렬:
[
[1, 1, 0, 0, 0],
[0, 1, 0, 0, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1]
]
중에는
3
개의 섬이 있다.생각:
일부 귀속적인 사상을 운용했는데 우선 이중 for순환이 하나하나 행렬을 반복하는 요소이다.
어떤 원소를 1로 찾았을 때 귀속적인 사상을 이용하여 이 원소의 상하좌우, 그것과 인접한true의 상하좌우원소, 인접한...이 원소들은false로 바뀐다
마지막 반환num
코드:
public static int numIslands(boolean[][] grid) {
// Write your code here
int num = 0;
if (grid == null)
return 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[i].length; j++) {
if (grid[i][j] == true) {
num++;
grid = change(grid, i, j);
}
}
}
return num;
}
public static boolean[][] change(boolean[][] grid, int i, int j) {
// false
grid[i][j] = false;
if (i > 0 && grid[i - 1][j] == true) {
//
grid = change(grid, i - 1, j);
}
if (j < grid[i].length - 1 && grid[i][j + 1] == true) {
//
grid = change(grid, i, j + 1);
}
if (j > 0 && grid[i][j - 1] == true) {
//
grid = change(grid, i, j - 1);
}
if (i < grid.length - 1 && grid[i + 1][j] == true) {
//
grid = change(grid, i + 1, j);
}
return grid;
}