给一个n x m
的矩阵,矩阵的值有0
、1
、2
,0
代表海,1
代表海岛,2
代表海岛上的城市(你可以看做2
是建立在1
的上面,即2
也也同时代表海岛)。
如果2
个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]
]
输出: 0
解释:
有3个海岛,但是他们都不含有城市。
样例2
输入:
[
[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]
]
输出: 2
解释:
有3个海岛,有2个海岛含有城市。
注意事项
- 我们只考虑上下左右为相邻。
n <= 100,m <= 100
。- 你可以假设矩阵的四个边都被海包围。
解题思路1:
与Lintcode 433:岛屿的个数类似。如果找到海岛,向上下左右四个方向递归地找邻接的岛,然后把海岛覆盖成海水,如果找到的是城市,把flag置为true
public class Solution {
/**
* @param grid: an integer matrix
* @return: an integer
*/
public int numIslandCities(int[][] grid) {
// Write your code here
if(grid == null || grid.length == 0)
return 0;
int count = 0;
for(int row = 0; row < grid.length; row++){
for(int col = 0; col < grid[row].length; col++){
if(grid[row][col] > 0){
flag = false;
helper(grid, row, col);
if(flag)
count++;
}
}
}
return count;
}
private boolean flag = false;
//查找以grid[row][col]为起点的上下左右四面有无的海岛城市,若有则置flag为true,同时将遍历的所有内容全部置0
private void helper(int[][] grid, int row, int col){
if(grid[row][col] == 2)
flag = true;
grid[row][col] = 0;
//left
if(col - 1 >= 0 && grid[row][col - 1] > 0)
helper(grid, row, col - 1);
//right
if(col + 1 < grid[row].length && grid[row][col + 1] > 0)
helper(grid, row, col + 1);
//Up
if(row - 1 >= 0 && grid[row - 1][col] > 0)
helper(grid, row - 1, col);
//down
if(row + 1 < grid.length && grid[row + 1][col] > 0)
helper(grid, row + 1, col);
return;
}
}