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

server/2024/9/23 6:32:34/

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

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/server/120674.html

相关文章

Vue(15)——组合式API②

生命周期函数 选项式组合式beforeCreate/createdsetupbeforeMountonBeforeMount mountedonMounedbeforeUpdateonBeforeUpdateupdatedonUpdatedbeforeUnmountonBeforeUnmountunmountedonUnmounted 父子通信 父传子基本思想&#xff1a; 父组件中给子组件绑定属性…

【鼠标滚轮专用芯片】KTH57913D 霍尔位置传感器

KTH5791 3D 霍尔位置传感器 -- 鼠标滚轮专用芯片 KTH5791AQ3QNS 产品概述 KTH5791 是一款基于 3D 霍尔磁感应原理的鼠标滚轮专用芯片&#xff0c;主要面向鼠标滚轮的旋转的应用场景。两个专用的正交输出使该产品可直接替代机械和光学旋转编码器的输出方式&#xff0c;使得鼠标…

计算机毕业设计Python深度学习房价预测 房价可视化 链家爬虫 房源爬虫 房源可视化 卷积神经网络 大数据毕业设计 机器学习 人工智能 AI

《Python房价预测系统》开题报告 一、选题背景与意义 1.1 选题背景 随着城市化进程的加速和居民生活水平的提高&#xff0c;房地产市场成为全球经济发展的重要驱动力之一。房价作为房地产市场的重要指标&#xff0c;不仅关系到国家经济安全&#xff0c;也直接影响广大人民群…

清空当前机器所有Docker容器和镜像

sudo docker stop $(sudo docker ps -aq) sudo docker rm $(sudo docker ps -aq) sudo docker rmi $(sudo docker images -q)删除当前机器上的所有Docker镜像是一个高风险操作&#xff0c;因为它会删除所有镜像&#xff0c;包括那些可能正在被容器使用的镜像。在执行此操作之前…

Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 内存分配和回收规则

文章目录 垃圾回收机制堆空间的基本结构内存分配和回收规则对象优先在 Eden 区分配分配担保机制 大对象直接进入老年代长期存活的对象进入老年代主要进行 GC 的区域部分收集 (Partial GC)&#xff1a;Minor GCMajor/Old GCMixed GC 整堆收集&#xff08;Full GC&#xff09; 空…

Nginx 负载均衡:优化网站性能与可扩展性的利器

在当今高流量的互联网时代&#xff0c;网站的性能和可扩展性成为了衡量其成功与否的关键因素之一。随着用户量的不断增加&#xff0c;单一服务器往往难以承受巨大的访问压力&#xff0c;这时就需要引入负载均衡技术来分散请求&#xff0c;提高系统的整体性能和可靠性。Nginx&am…

计算机网络第二章(部分)

R1. 五种非专用的因特网应用及它们所使用的应用层协议: 电子邮件 (Email) - 使用 SMTP&#xff08;简单邮件传输协议&#xff09;文件传输 (File Transfer) - 使用 FTP&#xff08;文件传输协议&#xff09;网页浏览 (Web Browsing) - 使用 HTTP/HTTPS&#xff08;超文本传输协…

2D目标检测常用loss

在2D目标检测任务中&#xff0c;常用的损失函数&#xff08;Loss&#xff09;主要用于优化以下三个关键方面&#xff1a; 类别分类&#xff08;Classification&#xff09;&#xff1a;用于区分检测到的对象属于哪一类。边界框回归&#xff08;Bounding Box Regression&#x…