题目的链接在这里:https://leetcode-cn.com/problems/number-of-islands/
题目大意
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
一、示意图
二、解题思路
BFS和DFS
DFS
代码如下:
class Solution {
boolean isVisited[][]=new boolean[301][301];
int[][] step={{0,1},{0,-1},{1,0},{-1,0}};
public int numIslands(char[][] grid) {
//然后是DFS
//也是从一个角度出发 然后进行遍历
int count=0;
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[0].length;j++){
//如果是1 并且没访问过 那就进行dfs
if(grid[i][j]=='1'&&!isVisited[i][j]){
DFS(grid,i,j);
count++;
}
}
}
return count;
}
private void DFS(char[][] grid,int i,int j) {
//只要条件不满足 直接返回
if(i<0||i>=grid.length||j<0||j>= grid[0].length||grid[i][j]!='1'||isVisited[i][j]){
return;
}
//然后进行递归
//不然的话 要把这个点设置成访问过了
//那这里就需要满足条件了
if(i>=0&&i<grid.length&&j>=0&&j<grid[0].length&&grid[i][j]=='1'&&!isVisited[i][j]) {
isVisited[i][j] = true;
for (int k = 0; k < 4; k++) {
DFS(grid, i + step[k][0], j + step[k][1]);
}
}
}
}
BFS
代码如下:
class Solution {
boolean[][] isVisited=new boolean[301][301];
Queue<Integer> queue=new LinkedList<>();
int[][] index={{0,1},{0,-1},{1,0},{-1,0}};
public int numIslands(char[][] grid) {
//由 1 0组成的 计算岛屿的数量
int count=0;
//先试试BFS 先找到第一个等于1 的点然后进栈
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[0].length;j++){
if(grid[i][j]=='1'&&!isVisited[i][j]){
//找到第一个等于1的数
queue.add(i);
queue.add(j);
//那就把他设置成访问过了
isVisited[i][j]=true;
//就相当于是一个涂色游戏 把他周围能图到的都涂一遍
BFS(grid);
//进行玩涂色游戏之后 就count加一
count++;
}
}
}
return count;
}
private void BFS(char[][] grid) {
while (!queue.isEmpty()){
int size=queue.size();
for(int i=0;i<size/2;i++){
//把这一层的值都拿出来
int x=queue.poll();
int y=queue.poll();
//然后进行他的四周判断
for(int k=0;k<4;k++){
int newX=x+index[k][0];
int newY=y+index[k][1];
//然后进行越界和未访问
if(newX>=0&&newX<grid.length&&newY>=0&&newY<grid[0].length&&!isVisited[newX][newY]&&grid[newX][newY]=='1'){
//那就把他设置成访问过了 并且进队列
isVisited[newX][newY]=true;
queue.add(newX);
queue.add(newY);
}
}
}
}
}
}