题干
给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
示例 1:
输入:
11110
11010
11000
00000
输出: 1
示例 2:
输入:
11000
11000
00100
00011
输出: 3
//BFS,使用队列的非递归广度优先搜索
private int m, n;
private int stepArr[][] = {{0,1},{1,0},{0,-1},{-1,0}};
public int numIslands(char[][] grid)
{
if(null == grid || grid.length == 0 || grid[0].length == 0)
return 0;
m = grid.length;//行
n = grid[0].length;//列
int count = 0;
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
{
if(grid[i][j] == '1') //遍历、后BFS,BFS一次计数+1
{
bfs(grid, i, j);
System.out.println();
count++;
}
}
}
return count;
}
public void bfs(char[][] grid, int i, int j)
{
Queue<Integer> queue = new LinkedList<Integer>();
queue.add(i * n + j);
System.out.println("x"+i+" y"+j);
grid[i][j] = '0';
while(null != queue.peek())
{
int num = queue.poll();
i = num / n;
j = num % n;
for(int k = 0; k < 4; k++)
{
int x =i + stepArr[k][0];
int y =j + stepArr[k][1];
if(x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == '1')
{
queue.add(x * n + y);
System.out.println("x"+x+" y"+y);
grid[x][y] = '0';
}
}
}
}
//DFS,使用递归的深度优先搜索,更快
private int m, n;
public int numIslands(char[][] grid)
{
if(null == grid || grid.length == 0 || grid[0].length == 0)
return 0;
m = grid.length;//行
n = grid[0].length;//列
int count = 0;
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
{
if(grid[i][j] == '1') //遍历、后BFS,BFS一次计数+1
{
dfs(grid, i, j);
count++;
}
}
}
return count;
}
private void dfs(char[][] grid, int i, int j)
{
if(j < n && i < m && j>=0 && i>=0 && grid[i][j] == '1')
{
grid[i][j] = '0';
dfs(grid,i+1,j);
dfs(grid,i,j+1);
dfs(grid,i-1,j);
dfs(grid,i,j-1);
}
}