
专题(六)双指针、BFS与图论——AcWing 1233. 全球变暖
标记陆地点:在DFS过程中,标记遍历到的每个陆地点,以避免重复处理。 检查邻居情况:在DFS过程中,检查当前点的四个邻居是否都是陆地。如果发现这样的点,则说明该岛屿不会被淹没。 避免重复处理:确保每个岛屿只被处理一次,避免重复计算。 初始化数组:读取输入并初始化数组g和backup,分别存储原始图像和备份图像。 DFS函数:标记当前点为已访问,检查其四个邻居是否都是陆地。如果是,设置标志isExist为true。 检查邻居:检查当前点的四个邻居,如果有任何一个邻居是海洋,则返回false,否则返回true。 遍历每个点:对于每个陆地点,调用DFS函数。如果该岛屿不会被淹没,则计数器加一。 输出结果:打印被完全淹没的岛屿数量。
发布日期:2021-05-08 21:31:11
浏览次数:20
分类:精选文章
本文共 2264 字,大约阅读时间需要 7 分钟。
在解决这个问题时,我们需要判断给定的岛屿是否会被完全淹没。根据题目描述,一个岛屿不会被淹没的条件是该岛屿上存在至少一个陆地点,其四个邻居(上下左右)都是陆地。否则,该岛屿会被淹没。
问题分析
为了确定岛屿是否会被淹没,我们可以采用深度优先搜索(DFS)来遍历每个岛屿。DFS不仅可以帮助我们标记所有属于同一岛屿的陆地点,还可以在遍历过程中检查是否存在满足条件的点。
解决思路
优化思路
- 内存优化:避免在每次递归调用时创建新的数组,而是直接在原数组上进行修改。
- 时间复杂度:确保算法的时间复杂度为O(N²),避免因内存分配问题导致超时。
代码实现
import java.io.*;public class Main { static int N = 1010; static int n; static char[][] g = new char[N][N]; static char[][] backup = new char[N][N]; static int dx[] = {-1, 0, 1, 0}; static int dy[] = {0, 1, 0, -1}; static boolean isExist; public static void dfs(int x, int y) { g[x][y] = '.'; // 标记为被访问过 if (check(x, y)) { isExist = true; } for (int i = 0; i < 4; i++) { int a = x + dx[i]; int b = y + dy[i]; if (a < 0 || a >= n || b < 0 || b >= n) continue; if (g[a][b] == '.') continue; dfs(a, b); } } public static boolean check(int x, int y) { for (int i = 0; i < 4; i++) { int a = x + dx[i]; int b = y + dy[i]; if (a < 0 || a >= n || b < 0 || b >= n) continue; if (backup[a][b] == '.') return false; } return true; } public static void main(String args[]) throws Exception { BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); n = Integer.parseInt(bf.readLine()); for (int i = 0; i < n; i++) { String s = bf.readLine(); g[i] = s.toCharArray(); backup[i] = s.toCharArray(); } int num = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (g[i][j] == '#') { isExist = false; dfs(i, j); if (!isExist) { num++; } } } } System.out.println(num); }}
代码解释
通过这种方法,我们可以高效地判断每个岛屿是否会被淹没,确保算法在合理时间内完成。
发表评论
最新留言
不错!
[***.144.177.141]2025年04月07日 09时52分26秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
设计模式-抽象工厂模式
2019-03-06
IntelliJ IDEA 中,项目文件右键菜单没有svn选项解决办法
2019-03-06
IDEA 调试Java代码的两个技巧
2019-03-06
Vue 数组和对象更新,但视图未更新,背后的故事
2019-03-06
剑指Offer面试题:9.二进制中1的个数
2019-03-06
《你是在做牛做马还是在做主管》- 读书笔记
2019-03-06
重新温习软件设计之路(4)
2019-03-06
MySQL数据库与python交互
2019-03-06
python如何对字符串进行html转义与反转义?
2019-03-06
开发小白也毫无压力的hexo静态博客建站全攻略 - 躺坑后亲诉心路历程
2019-03-06
golang基础--类型与变量
2019-03-06
.NetCore外国一些高质量博客分享
2019-03-06
解决WebRTC中不同的浏览器之间适配的问题
2019-03-06
深入理解JavaScript函数
2019-03-06
【spring源码系列】之【xml解析】
2019-03-06
(在模仿中精进数据可视化07)星球研究所大坝分布可视化
2019-03-06
(数据科学学习手札02)Python与R在循环语句与条件语句上的异同
2019-03-06
(数据科学学习手札27)sklearn数据集分割方法汇总
2019-03-06