题目解析
给定一个地图,找出有几个岛屿,以及有几个含有宝藏的岛屿
解题思路
可以通过dfs递归找出每个岛屿
如果当前位置不是水路,则判断当前位置是岛屿的陆地,还是岛屿上的宝藏
用一个全局变量存储,岛屿上是否有宝藏
最后将当前走过的位置设为水路
最后输出岛屿数量,以及有宝藏的岛屿数量
代码
import java.io.*;
import java.util.*;
public class Main
{
static int N = (int) 1e5;
static char map[][] = new char[N][]; // 地图
static int dxy[][] = new int[][]
{
{ -1, 0 },
{ 0, 1 },
{ 1, 0 },
{ 0, -1 } }; // 四个方向
static int n, m; // 地图大小
static boolean f; // 当前岛屿是否有宝藏
static boolean check(int x, int y)
{
return (0 <= x && x < n) && (0 <= y && y < m);
}
static void dfs(int x, int y)
{
if (map[x][y] > '1') f = true; // 如果当前地方是宝藏,则当前岛屿上有宝藏
map[x][y] = '0'; // 当前地方走过,标记为水路
for (int i = 0; i < 4; i++) // 遍历四个方向
{
int dx = x + dxy[i][0]; // 更新位置的横坐标
int dy = y + dxy[i][1]; // 更新位置的纵坐标
if (check(dx, dy) && map[dx][dy] != '0') // 如果当前位置在地图内 并且 当前不是水路
dfs(dx, dy); // 递归当前位置
}
}
public static void main(String[] args)
{
n = sc.nextInt();
m = sc.nextInt();
for (int i = 0; i < n; i++)
map[i] = sc.next().toCharArray();
int cnt = 0; // 当前有多少个岛屿
int ans = 0; // 当前有多少个岛屿上有宝藏
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (map[i][j] != '0') // 当前位置不是水路
{
f = false; // 初始化 当前岛屿没有宝藏
dfs(i, j);
cnt++; // 增加岛屿数量
if (f) ans++; // 当前岛屿有宝藏
}
}
}
out.println(cnt + " " + ans);
out.flush();
out.close();
}
static Scanner sc = new Scanner(System.in);
static PrintWriter out = new PrintWriter(System.out);
}