题解 | #岛屿数量#
岛屿数量
https://www.nowcoder.com/practice/0c9664d1554e466aa107d899418e814e
import java.util.*;
public class Solution {
/**
* 判断岛屿数量
* @param grid char字符型二维数组
* @return int整型
*/
public int solve (char[][] grid) {
// write code here
int m = grid.length;
int n = grid[0].length;
//记录岛屿数量
int count = 0 ;
for (int i = 0 ; i < m ; i++) {
for (int j = 0 ; j < n ; j++) {
//判断当前位置字符是否为1
//如果是1
if (grid[i][j] == '1') {
count++;
//方法1: dfs 一条路走到黑 把所有能到达的坐标如果是1都变成0
//dfs(grid,i,j);
//方法2: bfs 从被选中的点开始扩散 把该点周边的1都变成0
bfs(grid, i, j);
}
}
}
return count;
}
void dfs(char[][] grid, int i, int j) {
//dfs 结束条件 当数组越界时 或者 到达 '0' 时 终止遍历
if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length ||
grid[i][j] == '0')
return;
//将当前遍历到的'1' 变为 '0'
grid[i][j] = '0';
//向上遍历
dfs(grid, i - 1, j);
//向下遍历
dfs(grid, i + 1, j);
//向左遍历
dfs(grid, i, j - 1);
//向右遍历
dfs(grid, i, j + 1);
}
void bfs(char[][] grid, int i, int j) {
int len = grid[0].length;
//将当前遍历到的'1' 变为 '0'
grid[i][j] = '0';
//与dfs一条路走到底不同 bfs 是要把周边能到达的点都要变成 '0'
Queue<Integer> queue = new LinkedList<>();
//由于 队列中只能存储一种数据 而 地址信息由两位 因此使用code转换
int code = i * len + j;
queue.add(code);
while(!queue.isEmpty()){
//取出队首数据
int index = queue.poll();
int x = index/len;
int y = index%len;
if(x > 0 && x <= grid.length -1 && grid[x-1][y] == '1')
{
grid[x-1][y] = '0';
queue.add((x-1)*len+y);
}
if(x >= 0 && x < grid.length -1 && grid[x+1][y] == '1')
{
grid[x+1][y] = '0';
queue.add((x+1)*len+y);
}
if(y > 0 && y <= len -1 && grid[x][y-1] == '1')
{
grid[x][y-1] = '0';
queue.add(x*len+y-1);
}
if(y >= 0 && y < len-1 && grid[x][y+1] == '1')
{
grid[x][y+1] = '0';
queue.add(x*len+y+1);
}
}
}
}