Day53–图论–106. 岛屿的周长(卡码网),110. 字符串接龙(卡码网),105. 有向图的完全联通(卡码网)

106. 岛屿的周长(卡码网)

方法:深搜

思路:

遍历岛屿的每个节点,每个节点都查找它的四个方向,当触碰到边界(边界是水),或者格子是水的时候,边长加一。

题目说只有一个岛屿,所以深搜一次就完成了。

import java.util.*;public class Main {// 方向标private static final int[][] dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};// 计数器private static int count = 0;// 深搜private static void dfs(int[][] grid, boolean[][] visited, int x, int y) {if (visited[x][y]) {return;}visited[x][y] = true;// 处理本节点,当触碰到边界(边界是水),或者格子是水的时候,边长加一// 上if (x - 1 < 0 || grid[x - 1][y] == 0) {count++;}// 下if (x + 1 >= grid.length || grid[x + 1][y] == 0) {count++;}// 左if (y - 1 < 0 || grid[x][y - 1] == 0) {count++;}// 右if (y + 1 >= grid[0].length || grid[x][y + 1] == 0) {count++;}// 四个方向for (int i = 0; i < 4; i++) {int nextX = x + dir[i][0];int nextY = y + dir[i][1];if (nextX < 0 || nextX >= grid.length || nextY < 0 || nextY >= grid[0].length) {continue;}if (grid[nextX][nextY] == 1) {dfs(grid, visited, nextX, nextY);}}}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();}}// 遍历矩阵for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (!visited[i][j] && grid[i][j] == 1) {// 题目说只有一个岛屿,深搜一次就搞定了dfs(grid, visited, i, j);break;}}}System.out.println(count);}
}

方法:数学

思路:

  1. 先求岛屿总数sum,如果每一个都是孤岛,总边数 = sum*4
  2. 再求重叠的孤岛,每重叠一条边,边数减二。重叠cover条,就是减去2*cover
  3. 注意,要避免重复计算。顺序遍历的话,只算左和上就好,不要算右和下。
import java.util.*;public class Main {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];for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {grid[i][j] = in.nextInt();}}int sum = 0;    // 陆地数量int cover = 0;  // 相邻数量for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (grid[i][j] == 1) {sum++; // 统计总的陆地数量// 统计上边相邻陆地if(i - 1 >= 0 && grid[i - 1][j] == 1) cover++;// 统计左边相邻陆地if(j - 1 >= 0 && grid[i][j - 1] == 1) cover++;// 为什么没统计下边和右边? 因为避免重复计算}}}System.out.println(sum * 4 - cover * 2);}
}

110. 字符串接龙(卡码网)

方法:广搜

思路:

在无权图中,用广搜求最短路最为合适,广搜只要搜到了终点,那么一定是最短的路径。因为广搜就是以起点中心向四周扩散的搜索。

枚举,用26个字母替换当前字符串的每一个字符,在看替换后是否在 wordSet里出现过,就可以判断两个字符串是否是链接的。

使用visitMap,记录已访问的字符串及其路径长度。

import java.util.*;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();String beginStr = in.next();String endStr = in.next();// word集Set<String> wordSet = new HashSet<>();for (int i = 0; i < n; i++) {wordSet.add(in.next());}// 记录已访问的字符串及其路径长度Map<String, Integer> visitMap = new HashMap<>();// 初始化队列Deque<String> que = new ArrayDeque<>();que.offer(beginStr);// 初始化访问映射visitMap.put(beginStr, 1);while (!que.isEmpty()) {String word = que.poll();int path = visitMap.get(word);// 逐个字符替换尝试for (int i = 0; i < word.length(); i++) {// 转换为字符数组便于修改char[] charArray = word.toCharArray();// 尝试26个字母for (char c = 'a'; c <= 'z'; c++) {charArray[i] = c;String newWord = new String(charArray);// 找到目标单词if (newWord.equals(endStr)) {System.out.println(path + 1);return;}// 检查是否在集合中且未被访问过if (wordSet.contains(newWord) && !visitMap.containsKey(newWord)) {visitMap.put(newWord, path + 1);que.offer(newWord);}}}}// 无法到达目标单词System.out.println(0);}
}

105. 有向图的完全联通(卡码网)

方法:广搜

思路:

可以说是广搜模板题了。录入数据之后,用visited数组做访问标志,广搜就完成了。

import java.util.*;public class Main {// 邻接表private static List<List<Integer>> graph = new ArrayList<>();// 访问标志private static boolean[] visited;// 广搜private static void bfs(int start) {Deque<Integer> que = new ArrayDeque<>();visited[start] = true;que.offer(start);while (!que.isEmpty()) {int node = que.poll();for (int i : graph.get(node)) {if (!visited[i]) {visited[i] = true;que.offer(i);}}}}// 主函数public static void main(String[] args) {// 录入数据Scanner in = new Scanner(System.in);int n = in.nextInt();int k = in.nextInt();visited = new boolean[n + 1];for (int i = 0; i <= n; i++) {graph.add(new LinkedList<>());}for (int i = 0; i < k; i++) {int from = in.nextInt();int to = in.nextInt();graph.get(from).add(to);}// 广搜bfs(1);// 检查输出boolean flag = true;for (int i = 1; i <= n; i++) {if (!visited[i]) {flag = false;break;}}if (flag) {System.out.println(1);} else {System.out.println(-1);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:
http://www.pswp.cn/web/93452.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93452.shtml
英文地址,请注明出处:http://en.pswp.cn/web/93452.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch 数据建模与映射(Mapping)详解

在 Elasticsearch 中&#xff0c;数据建模与映射&#xff08;Mapping&#xff09; 是决定搜索性能、存储效率和功能支持的核心环节。合理的映射设计能让搜索更精准、聚合更高效、存储更节省。 本文将全面详解 Elasticsearch 的 数据建模原则、字段类型、动态映射、自定义分析器…

5G工业一体机汽车零部件工厂的无纸化管理

在全球数字化转型的浪潮中&#xff0c;制造业对信息化、智能化的需求日益强烈。尤其是在汽车零部件领域&#xff0c;生产线的复杂性、质量追溯的苛刻性以及对效率的高要求&#xff0c;迫切需要一种高效、可靠、可扩展的管理模式。以“5G工业一体机”为核心的无纸化管理&#xf…

项目管理工具

1、概述IT 项目生命周期通常可分为启动、规划、执行、监控与控制、收尾五个核心阶段&#xff0c;每个阶段的目标和任务不同&#xff0c;所依赖的工具也各有侧重。以下按阶段梳理常用工具&#xff0c;涵盖项目管理、协作、技术开发等多个维度。2、启动阶段&#xff1a;明确项目目…

Linux 进程、线程与 exec/系统调用详解

1. wait 与 waitpid —— 子进程资源回收1.1 waitpid_t wait(int *wstatus);功能&#xff1a;阻塞等待&#xff0c;回收任意子进程的资源空间。参数&#xff1a;wstatus&#xff1a;保存子进程退出状态的变量地址NULL&#xff1a;不保存退出状态返回值&#xff1a;成功&#xf…

Laravel 使用ssh链接远程数据库

1.创建ssh ssh -i ./id_rsa -N -L 13306:127.0.0.1:3306 -p 22 root***对上述代码的解释&#xff1a; 命令是一个SSH隧道命令&#xff0c;用于将本地端口3306转发到远程服务器上的3306端口。以下是命令的详细解释&#xff1a;# 调用SSH客户端。 ssh # 指定用于身份验证的私钥文…

Python延申内容(一)

1.技术面试题 &#xff08;1&#xff09;TCP与UDP的区别是什么&#xff1f; 答&#xff1a; TCP&#xff08;传输控制协议&#xff09;&#xff1a;面向连接、可靠传输&#xff08;数据完整有序&#xff09;、流量控制、拥塞控制&#xff0c;适用于文件传输、网页浏览等场景。 …

Java 9 新特性及具体应用

目录 1. 模块系统&#xff08;Jigsaw&#xff09; 2. JShell&#xff08;REPL工具&#xff09; 3. 集合工厂方法 4. 接口私有方法 5. Stream API 增强 6. HTTP/2 客户端&#xff08;Incubator&#xff09; 7. 多版本JAR包 总结 1. 模块系统&#xff08;Jigsaw&#xff0…

第二十五天:构造函数/析构函数/拷贝构造

构造函数/析构函数/拷贝构造 1. 构造函数&#xff08;Constructor&#xff09; 定义与作用&#xff1a;构造函数是一种特殊的成员函数&#xff0c;其名称与类名相同&#xff0c;没有返回类型&#xff08;包括 void 也没有&#xff09;。它的主要作用是在创建对象时初始化对象的…

【P14 3-6 】OpenCV Python——视频加载、摄像头调用、视频基本信息获取(宽、高、帧率、总帧数),视频保存在指定位置

文章目录1 读取本地视频1.1 绝对路径 6种方式1.2 相对路径 4种方式1.3 读取本地视频2 视频基本信息3 调用摄像头 并将视频保存在指定位置P14 3-6 1 读取本地视频 现在要读取本地视频“video.mp4”&#xff0c; 视频文件“video.mp4”和playVideo.py脚本文件&#xff0c;都在…

【DL学习笔记】常用数据集总结

一、如何找数据集 paperswithcode&#xff0c;但好像没了 AutoDL Roboflow Kaggle Hungging Face 百度飞浆PP AIStudio 二、目标检测数据集格式 常用数据集坐标格式 MSCOCO &#xff1a; 坐标格式&#xff08;x&#xff0c;y&#xff0c;w&#xff0c;h&#xff…

19.3 Transformers量化模型极速加载指南:4倍推理加速+75%显存节省实战

Transformers量化模型极速加载指南:4倍推理加速+75%显存节省实战 实战项目:模型量化 Transformers 兼容性配置 量化模型加载核心配置逻辑 #mermaid-svg-rDjfMigtxckLYWp3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#merm…

Android 终端接入 GB28181 国标视频平台的完整解决方案解析

1. 引言&#xff1a;让 Android 终端无缝融入国标视频网络在公安、交通、应急、工业、教育等领域&#xff0c;GB/T 28181 国标协议早已成为视频监控与指挥调度的事实标准。传统国标视频网络通常由固定部署的 IPC 摄像机、NVR、视频管理平台构成&#xff0c;设备形态单一。随着一…

Docker目录的迁移

# 迁移 docker 目录 &#xff08;无论容器与镜像占用空间大小&#xff0c;哪怕只占用1G&#xff0c;也需用此方式&#xff0c;否则可能迁移不成功&#xff09;service docker stopcd /var/lib/docker# 一个一个复制除 overlay2 外的其他所有文件夹cp -R builder /home/docker/l…

IOS APP 前端存储

UserDefaults优点简单易用提供简单的键值对存储接口无需复杂配置&#xff0c;开箱即用适合存储少量简单数据轻量级专门为存储小量数据设计内存占用小性能开销低自动持久化数据自动保存到磁盘应用重启后数据仍然可用通过synchronize()方法可以强制立即写入&#xff08;iOS 12已自…

在前端js中使用jsPDF或react-to-pdf生成pdf文件时,不使用默认下载,而是存储到服务器

开源地址&#xff1a; https://github.com/ivmarcos/react-to-pdf 主要就是这个方法&#xff0c;有三种可选&#xff1a; 默认是save&#xff0c;也就是会自动触发下载的方法&#xff0c;open方法是默认会打开一个pdf预览的tab页面&#xff0c;build方法就是在调用的函数gener…

会议征稿!IOP出版|第二届人工智能、光电子学与光学技术国际研讨会(AIOT2025)

往届已EI检索&#xff0c;欢迎投稿&#xff01; AIOT2024会后两个月实现见刊&#xff01; AIOT2025已通过IOP-JPCS出版申请&#xff0c;独立JPCS出版 AIOT2025已上线西安文理学院官网&#xff1a; 征文通知&#xff5c;第二届人工智能、光电子学与光学技术国际…

CPP多线程2:多线程竞争与死锁问题

在多线程编程中&#xff0c;多个线程协同工作能显著提升程序效率&#xff0c;但当它们需要共享和操作同一资源时&#xff0c;潜在的问题也随之而来&#xff1b;线程间的执行顺序不确定性可能导致资源竞争&#xff0c;可能引发死锁&#xff0c;让程序陷入停滞。 多线程竞争问题示…

全国产飞腾d2000+复旦微690t信号处理模块

UD VPX-404是基于高速模拟/数字采集回放、FPGA信号实时处理、CPU主控、高速SSD实时存储架构开发的一款高度集成的信号处理组合模块&#xff0c;采用6U VPX架构&#xff0c;模块装上外壳即为独立整机&#xff0c;方便用户二次开发。 UD VPX-404模块的国产率可达到100%&#xff0…

物联网 (IoT) 的顶级硬件平台

物联网 &#xff08;IoT&#xff09; 的顶级硬件平台IoT&#xff08;物联网&#xff09;不再是一个流行词。随着每天出现几个鼓舞人心的用例&#xff0c;多家公司现在正在探索如何利用该技术实现业务增长。无论实施何种其他技术&#xff0c;基于物联网的新设备正迅速成为一项重…

TCP传输层协议(4)

TCP应用层协议&#xff08;4&#xff09; 流量控制 接收端处理数据的速度是有限的. 如果发送端发的太快, 导致接收端的缓冲区被打满, 这个时候如果发送端继续发送, 就会造成丢包, 继而引起丢包重传等等一系列连锁反应. 因此 TCP 支持根据接收端的处理能力, 来决定发送端的发送速…