目录
- 岛屿数量 深搜
- 岛屿数量 广搜
- 岛屿的最大面积
一、岛屿数量 深搜
99. 岛屿数量
![]()
import java.util.*;
public class Main{
static int[] dx = {0,0,1,-1};
static int[] dy = {1,-1,0,0};
public static void main(String[] args){
//用DFS
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[][] grid = new int[n][m];
int res = 0;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
grid[i][j] = in.nextInt();
}
}
boolean[][] visited = new boolean[n][m];
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
//这个点没被访问过且该点为1
if(!visited[i][j] && grid[i][j] == 1){
res++;
visited[i][j] = true;
dfs(visited,i,j,grid);
}
}
}
System.out.println(res);
}
public static void dfs(boolean[][] visited, int x ,int y, int[][] grid){
for(int i=0; i<4; i++){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx >= 0 && nx < grid.length && ny >=0 && ny < grid[0].length
&& !visited[nx][ny] && grid[nx][ny] == 1){
visited[nx][ny] = true;
dfs(visited, nx, ny, grid);
}
}
}
}
二、 岛屿数量 广搜
import java.util.*;
public class Main{
static boolean[][] visited;
static int[] dx = {0,0,1,-1};
static int[] dy = {1,-1,0,0};
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
visited = new boolean[n][m];
int[][] grid = new int[n][m];
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
grid[i][j] = in.nextInt();
}
}
int res = 0;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(!visited[i][j] && grid[i][j] == 1){
res++;
bfs(grid, visited, i , j);
}
}
}
System.out.println(res);
}
public static void bfs(int[][] grid, boolean[][] visited, int x, int y){
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[]{x,y});
visited[x][y] = true;
while(!queue.isEmpty()){
int[] cur = queue.poll();
int curX = cur[0];
int curY = cur[1];
for(int i=0; i<4; i++){
int nx = curX + dx[i];
int ny = curY + dy[i];
if(nx >= 0 && nx < grid.length && ny >=0 && ny < grid[0].length
&& !visited[nx][ny] && grid[nx][ny] == 1){
queue.add(new int[]{nx,ny});
visited[nx][ny] = true;
}
}
}
}
}
三、岛屿的最大面积
100. 岛屿的最大面积
![]()
import java.util.*;
class Main{
static int[] dx = {0,0,1,-1};
static int[] dy = {1,-1,0,0};
static int area;
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[][] grid = new int[n][m];
boolean[][] visited = new boolean[n][m];
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
grid[i][j] = in.nextInt();
}
}
int maxArea = 0;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(!visited[i][j] && grid[i][j] == 1){
area = 0;
bfs(grid, visited, i, j);
maxArea = Math.max(maxArea, area);
}
}
}
System.out.println(maxArea);
}
public static void bfs(int[][] grid, boolean[][] visited, int x, int y){
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[]{x,y});
visited[x][y] = true;
area++;
while(!queue.isEmpty()){
int[] cur = queue.poll();
int curX = cur[0];
int curY = cur[1];
for(int i=0; i<4; i++){
int nx = curX + dx[i];
int ny = curY + dy[i];
if(nx >= 0 && nx < grid.length && ny >= 0 && ny < grid[0].length
&& !visited[nx][ny] && grid[nx][ny] == 1){
queue.add(new int[]{nx,ny});
visited[nx][ny] = true;
area++;
}
}
}
}
}