算法打卡:第十一章 图论part04

news/2024/9/23 8:05:31/

今日收获:字符串接龙,有向图的完全可达性,岛屿的周长

1. 字符串接龙

题目链接:110. 字符串接龙 (kamacoder.com)

思路:广度优先遍历适合解决两个点之间的最短路径问题,通常使用队列模拟一圈圈遍历。

(1)对于起始字符串的每一个字符分别替换为a到z的字符,如果新字符在字典中,就将其加入队列,作为本圈可以遍历到的字符串。然后再将原来的字符还原,接着替换下一个字符

(2)需要利用visited集合判断变化后的新字符串是否访问过,否则可能会出现重复变化的情况。

(3)每一层队列遍历完成后,路径数加1;如果变化字符后出现了结果字符串,直接返回

方法:

java">import java.util.Scanner;
import java.util.HashSet;
import java.util.Queue;
import java.util.LinkedList;public class Main{public static void main(String[] args){// 接收数据Scanner sc=new Scanner(System.in);int N=sc.nextInt();sc.nextLine(); // 消耗换行符String[] strs=sc.nextLine().split(" ");HashSet<String> strList=new HashSet<>();  // 便于查找字典for (int i=0;i<N;i++){strList.add(sc.nextLine());}int result=bfs(strs[0],strs[1],strList);System.out.println(result);}public static int bfs(String beginStr,String endStr,HashSet<String> strList){// 存放广度优先遍历的元素Queue<String> queue=new LinkedList<>();// 防止元素重复访问HashSet<String> visited=new HashSet<>();queue.offer(beginStr);visited.add(beginStr);int path=1;  // 起点算一次while (!queue.isEmpty()){int size=queue.size();  // 当前层的元素数量for (int k=0;k<size;k++){String current=queue.poll();// 变换当前字符串中的每一个字符,广度优先遍历char[] chars=current.toCharArray();int len=chars.length;for (int i=0;i<len;i++){char origin=chars[i];for (char c='a';c<='z';c++){chars[i]=c;String newStr=new String(chars);if(newStr.equals(endStr)){  // 遇到结果直接返回return path+1;}if (!visited.contains(newStr)&&strList.contains(newStr)){  // 如果变换后的字符串存在于字典中queue.offer(newStr);visited.add(newStr);}}chars[i]=origin;}}path++; // 遍历完一层}return 0; // 不存在转换序列}
}

总结:nextInt不会消耗换行符,接下来用nextLine可以消耗换行符,否则下一个nextLine读到的是空字符串。

2. 有向图的完全可达性

题目链接:105. 有向图的完全可达性 (kamacoder.com)

思路:利用深度优先遍历对节点进行染色。

(1)利用邻接表存储图,遍历当前节点的相邻节点时可以利用增强for循环

(2)递归函数中处理的是当前节点。如果已经访问过则返回,否则标记当前节点已访问并且深度优先遍历其相邻节点

(3)遍历访问数组判断其他节点是否都能访问到

方法:

java">import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;public class Main{public static void main(String[] args){Scanner sc=new Scanner(System.in);int N=sc.nextInt();int K=sc.nextInt();// 邻接表List<List<Integer>> grid=new ArrayList<>(N+1);for (int i=0;i<N+1;i++){grid.add(new LinkedList<>());}for (int i=0;i<K;i++){int s=sc.nextInt();int t=sc.nextInt();grid.get(s).add(t);}boolean[] visited=new boolean[N+1];dfs(grid,1,visited);// 判断所有节点是否能到达for (int i=2;i<N+1;i++){if (!visited[i]){System.out.println(-1);return;}}System.out.println(1);}public static void dfs(List<List<Integer>> grid,int curr,boolean[] visited){// 处理当前节点if (visited[curr]){  // 当前节点被访问过return;}visited[curr]=true;  // 标记当前节点for (int next:grid.get(curr)){dfs(grid,next,visited);}}
}

3. 岛屿的周长

题目链接:106. 岛屿的周长 (kamacoder.com)

思路:遇到陆地就判断其周围的格子是否出界或者是水域,是的话就算岛屿的一条边。不涉及深搜或广搜。

方法:

java">import java.util.Scanner;public class Main{static int[][] around={{0,1},{-1,0},{0,-1},{1,0}};public static void main(String[] args){Scanner sc=new Scanner(System.in);int N=sc.nextInt();int M=sc.nextInt();int[][] grid=new int[N][M];for (int i=0;i<N;i++){for (int j=0;j<M;j++){grid[i][j]=sc.nextInt();}}int result=0;for (int i=0;i<N;i++){for (int j=0;j<M;j++){if (grid[i][j]==1){  // 计算陆地周围是否为水域或出界for (int k=0;k<4;k++){int nextX=i+around[k][0];int nextY=j+around[k][1];if (nextX<0||nextY<0||nextX>=grid.length||nextY>=grid[0].length){result++;continue;}if (grid[nextX][nextY]==0){result++;}}}}}System.out.println(result);}
}

http://www.ppmy.cn/news/1529223.html

相关文章

数据库(mysql)常用命令

一.常见的数据库端口号 Mysql默认端口:3306 oracle 默认端口:1521 Sql server 默认端口:1433 注:Mysql采用 的是C/S(客户端/服务器端)架构 二.sql 语法基础 服务器,数据库,数据表,记录,字段之间的关系: 一台Mysql服务器可以管理多个数据库 一个数据库可以存在多张二维表…

技术美术百人计划 | 《4.1 Bloom算法》笔记

1. Bloom算法介绍 1.1. Bloom效果 实际拍摄照片与游戏画面Bloom效果对比&#xff0c;Bloom模拟了真实世界图片的效果 Bloom流程图 1.2. 前置知识&#xff1a;HDR和LDR&#xff0c;高斯模糊 1.2.1. HDR和LDR LDR颜色范围太少&#xff0c;精度不够&#xff0c;往往会存在颜色精…

前端入门:HTML+CSS

引言&#xff1a; 前端三大件&#xff1a;HTML、CSS、JS&#xff0c;每一个部分都很重要&#xff0c;我听过比较形象的比喻就是HTML&#xff08;HYPER TEXT MARKUP LANGUAGE&#xff09;相当于骨架&#xff0c;而CSS就是装饰渲染&#xff0c;JS则是动作功能实现。 之前的文章…

实验报告1--Spring Boot自定义异常处理

实验报告1-Spring Boot自定义异常处理&#xff08;1&#xff09; 实验报告1-Spring Boot自定义异常处理&#xff08;2&#xff09; 资源下载 一、实现思路 实现根据员工id删除员工对象的功能。 要求&#xff1a;1、处理Exception异常。 2、处理自定义的MyException异常。 …

常见项目场景题1(数据量很大时如何去重,实现超时处理)

数据很多&#xff0c;限制内存&#xff0c;如何去重 对于大数据量去重的场景&#xff0c;我们可以考虑使用位图(Bitmap) Bitmap 是使用二进制来表示某个元素是否存在的数组。用0和1来表示存在与不存在 使用Bitmap的话&#xff0c;一个数字占用1bit&#xff0c;大大减少内存消耗…

Python | Leetcode Python题解之第429题N叉树的层序遍历

题目&#xff1a; 题解&#xff1a; class Solution:def levelOrder(self, root: Node) -> List[List[int]]:if not root:return []ans list()q deque([root])while q:cnt len(q)level list()for _ in range(cnt):cur q.popleft()level.append(cur.val)for child in c…

医院信息化运维监控:确保医疗系统的稳定与安全

在当今数字化时代&#xff0c;医院的信息化水平直接关系到医疗服务的效率和质量。随着医疗信息化的不断推进&#xff0c;医院对信息化运维监控的需求也日益增强。特别是IT软硬件资源监控和机房动环监控&#xff0c;它们在保障医院信息系统稳定运行中发挥着至关重要的作用。 首先…

大话Python|基础语法(上)

一、单行注释 以下代码输出一个Hello World&#xff01;字符串 在Python代码中&#xff0c;注释会自动被Python解析器忽略 print(Hello World) 二、多行注释 在Python代码中&#xff0c;注释一共有两种形式&#xff1b; 1、单行注释&#xff1a;注释的内容只有一行 2、多行…