问题描述
Given a matrix of size n x m, the elements in the matrix are 0、1、2. 0 for the sea, 1 for the island, and 2 for the city on the island(You can assume that 2 is built on 1, ie 2 also represents the island).
If two 1 are adjacent, then these two 1 belong to the same island. Find the number of islands with at least one city.
注意事项
- 我们只考虑上下左右为相邻。
- n <= 100,m <= 100。
- 你可以假设矩阵的四个边都被海包围
样例
Given mat =
[
[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]
]
, return 0.
Explanation:
There are 3 islands, but none of them contain cities.
Given mat =
[
[1,1,0,0,0],
[0,1,0,0,1],
[0,0,2,1,2],
[0,0,0,0,0],
[0,0,0,0,2]
]
, return 2.
Explanation:
There are 3 islands, and two of them have cities.
分析
这道题和 LintCode_433 相似,如果找到海岛,向上下左右四个方向递归地找邻接的岛,然后把海岛覆盖成海水,如果找到的是城市,把flag置为true
代码
public class Solution {
/**
* @param grid: an integer matrix
* @return: an integer
*/
public int numIslandCities(int[][] grid) {
if(grid == null || grid.length == 0) {
return 0;
}
final int row = grid.length;
final int col = grid[0].length;
int count = 0;
for(int i = 0; i < row; i++) {
for(int j = 0; j < col; j++) {
if(grid[i][j] > 0) {
flag = false;
spread(grid, i, j);
if(flag) {
count++;
}
}
}
}
return count;
}
private boolean flag;
private void spread(int[][] grid, int i, int j) {
if(grid[i][j] == 2) {
flag = true;
}
grid[i][j] = 0;
//up
if(i - 1 >= 0 && grid[i - 1][j] > 0) {
spread(grid, i - 1, j);
}
//down
if(i + 1 <= grid.length - 1 && grid[i + 1][j] > 0) {
spread(grid, i + 1, j);
}
//left
if(j - 1 >= 0 && grid[i][j - 1] > 0) {
spread(grid, i, j - 1);
}
//right
if(j + 1 <= grid[0].length - 1 && grid[i][j + 1] > 0) {
spread(grid, i, j + 1);
}
return;
}
}