L2-048 寻宝图 - java

题目解析

给定一个地图,找出有几个岛屿,以及有几个含有宝藏的岛屿

解题思路

可以通过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);

}

toCharArray


团体程序设计天梯赛-练习集-java

赞赏