代码随想录算法训练营day67 | 110.字符串接龙、105. 有向图的完全可达性、106. 岛屿的周长

本次题目全部来自卡码网

110.字符串接龙

本题只需要求出最短路径的长度就可以了,不用找出具体路径。

所以这道题要解决两个问题:

  • 图中的线是如何连在一起的
  • 起点和终点的最短路径长度

首先题目中并没有给出点与点之间的连线,而是要我们自己去连,条件是字符只能差一个。所以判断点与点之间的关系,需要判断是不是差一个字符,如果差一个字符,那就是有连接。

然后就是求起点和终点的最短路径长度,这里无向图求最短路,广搜最为合适,广搜只要搜到了终点,那么一定是最短的路径。因为广搜就是以起点中心向四周扩散的搜索。

另外需要有一个注意点:

  • 本题是一个无向图,需要用标记位,标记着节点是否走过,否则就会死循环!
  • 使用set来检查字符串是否出现在字符串集合里更快一些
import collectionsif __name__ == '__main__':n = int(input())strSet = set()beginStr, endStr = input().strip().split()for _ in range(n):strSet.add(input())# 记录strSet里的字符串是否被访问过,同时记录路径长度visitMap = dict()  # <记录的字符串,路径长度># 初始化队列que = collections.deque()que.append(beginStr)# 初始化visitMapvisitMap[beginStr] = 1while que:word = que.popleft()path = visitMap.get(word)  # 这个字符串在路径中的长度# 开始在这个str中,挨个字符去替换for i in range(len(word)):newWord = word# 遍历26个字母for j in range(26):newWord = word[:i] + chr(j + ord('a')) + word[i+1:]if newWord == endStr:  # 发现替换字母后,字符串与终点字符串相同print(path + 1)  # 找到了路径exit()# 字符串集合里出现了newWord,并且newWord没有被访问过if newWord in strSet and newWord not in visitMap:# 添加访问信息,并将新字符串放到队列中visitMap[newWord] = path + 1que.append(newWord)# 没找到输出0print(0)

105. 有向图的完全可达性

两种深度优先搜索的算法主要是终止条件的位置不同

# 写法一:dfs 处理当前访问的节点
def dfs(graph, key, visited):if visited[key]:returnvisited[key] = Truekeys = graph[key]for key in keys:dfs(graph, key, visited)if __name__ == '__main__':n, m = map(int, input().strip().split())# 节点编号从1到n,所以申请 n+1 这么大的数组graph = [[] for _ in range(n + 1)]  # 邻接表while m > 0:s, t = map(int, input().strip().split())# 使用邻接表 ,表示 s -> t 是相连的graph[s].append(t)m -= 1visited = [False] * (n + 1)dfs(graph, 1, visited);# 检查是否都访问到了for i in range(1, n + 1):if not visited[i]:print(-1)exit()print(1)# 写法二:处理下一个要访问的节点
def dfs(graph, key, visited):keys = graph[key]for key in keys:if not visited[key]:visited[key] = Truedfs(graph, key, visited)if __name__ == '__main__':n, m = map(int, input().strip().split())# 节点编号从1到n,所以申请 n+1 这么大的数组graph = [[] for _ in range(n + 1)]  # 邻接表while m > 0:s, t = map(int, input().strip().split())# 使用邻接表 ,表示 s -> t 是相连的graph[s].append(t)m -= 1visited = [False] * (n + 1)visited[1] = Truedfs(graph, 1, visited)# 检查是否都访问到了for i in range(1, n + 1):if not visited[i]:print(-1)exit()print(1)

广度优先搜索

if __name__ == '__main__':n, m = map(int, input().strip().split())# 节点编号从1到n,所以申请 n+1 这么大的数组graph = [[] for _ in range(n + 1)]  # 邻接表while m > 0:s, t = map(int, input().strip().split())# 使用邻接表 ,表示 s -> t 是相连的graph[s].append(t)m -= 1visited = [False] * (n + 1)visited[1] = Trueque = [1]# 广度优先搜索的过程while que:key = que.pop()keys = graph[key]for key in keys:if not visited[key]:que.append(key)visited[key] = True# 检查是否都访问到了for i in range(1, n + 1):if not visited[i]:print(-1)exit()print(1)

106. 岛屿的周长

解法一: 遍历每一个空格,遇到岛屿则计算其上下左右的空格情况。

如果该陆地上下左右的空格是有水域,则说明是一条边。如果该陆地上下左右的空格出界了,则说明是一条边。

if __name__ == '__main__':n, m = map(int, input().strip().split())grid = [[i for i in map(int, input().strip().split())] for _ in range(n)]dir = [(1, 0), (-1, 0), (0, 1), (0, -1)]result = 0for i in range(n):for j in range(m):if grid[i][j] == 1:for k in range(4):x = i + dir[k][0]y = j + dir[k][1]if x < 0 or x >= len(grid) or y < 0 or y >= len(grid[0]) or grid[x][y] == 0:result += 1print(result)

解法二: 计算出总的岛屿数量,总的变数为:岛屿数量 * 4

因为有一对相邻两个陆地,边的总数就要减2。那么只需要在计算出相邻岛屿的数量就可以了,相邻岛屿数量为cover。

result = 岛屿数量 * 4 - cover * 2;

if __name__ == '__main__':n, m = map(int, input().strip().split())grid = [[i for i in map(int, input().strip().split())] for _ in range(n)]_sum = 0  # 陆地数量cover = 0  # 相邻数量for i in range(n):for j in range(m):if grid[i][j] == 1:_sum += 1  # 统计总的陆地数量# 统计上边相邻陆地if i - 1 >= 0 and grid[i-1][j] == 1:cover += 1# 统计左边相邻陆地if j - 1 >= 0 and grid[i][j-1] == 1:cover += 1# 为什么没统计下边和右边? 因为避免重复计算print(_sum * 4 - cover * 2)

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

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

相关文章

驼峰命名法在编程中的应用

驼峰命名法在编程中的应用 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;驼峰命名法&#xff08;Camel Case&#xff09;是一种常见的命名约定&#xff0c;在编…

IPython “%%script“ 魔法命令:跨平台脚本执行指南

IPython是一个强大的交互式Python解释器&#xff0c;提供了许多增强功能来提高开发效率。其中&#xff0c;%%script魔法命令是一个非常有用的特性&#xff0c;它允许用户在IPython环境中执行外部脚本。本文将详细介绍%%script命令的使用方法&#xff0c;包括其基本概念、使用场…

前端 JS 经典:函数签名

函数签名是什么&#xff1f;函数签名 函数名 参数 返回类型。 当我们明确了这 3 样东西&#xff0c;那么这个函数的作用和用法就确定了&#xff0c;它内部怎么实现的&#xff0c;我们完全不用管。 如下&#xff0c;我们知道这是一个判断属性是否对象的函数&#xff0c;只需…

SQL 基本语法

SQL&#xff08;Structured Query Language&#xff09;是一种用于管理和操作关系型数据库的语言。以下是SQL的基本语法&#xff1a; 创建数据库&#xff1a; CREATE DATABASE database_name;使用数据库&#xff1a; USE database_name;创建表&#xff1a; CREATE TABLE table_…

基于多模态知识图谱的多模态推理-MR-MKG

MR-MKG论文中提出了一种新的多模态推理方法&#xff0c;即利用多模态知识图&#xff08;Multimodal Knowledge Graph, MMKG&#xff09;进行多模态推理的方法。这种方法旨在通过从MMKG中学习&#xff0c;扩展大型语言模型&#xff08;LLMs&#xff09;的多模态知识。 1 三个模…

面对.rmallox勒索病毒:如何有效防范及应对

引言&#xff1a; 在当今数字化社会&#xff0c;网络安全问题日益严重&#xff0c;勒索病毒成为企业和个人不可忽视的威胁之一。最近出现的.rmallox勒索病毒更是给全球各地的用户带来了严重的数据安全问题。本文将探讨.rmallox勒索病毒的特点、感染方式及应对策略&#xff0c;…

探索CSS布局:创建一个居中的内嵌方块示例

在网页设计中&#xff0c;布局是至关重要的部分。CSS提供了多种方式来实现元素的布局&#xff0c;包括居中对齐、外边距、内边距等。本文将通过一个简单的示例&#xff0c;介绍如何使用CSS来创建一个居中的内嵌方块&#xff0c;并探讨其背后的布局原理。 HTML 结构 首先&…

java服务MultipartFile入参测试

项目中经常会涉及到文件的上传下载以及导入相关的功能&#xff0c;今天针对MultipartFile类型文档导入写一下如何测试。 文档导入接口完成&#xff0c;使用postman测试&#xff0c;使用POST方法&#xff0c;进入Body模块&#xff0c;选择form-data选项&#xff0c;key的框体右侧…

微服务部署上线过程总结

目录 一、找到适合自己的部署方式 二、开始部署&#xff0c;先安装需要的环境 2.1 梳理一下都需要安装什么软件 2.2 配置数据库环境 2.3 配置redis 2.4 配置nacos 2.5 配置rabbitmq 2.6 配置docker环境 三、环境配置好了&#xff0c;开始部署后端 3.1 梳理后端都…

韩顺平0基础学java——第32天

p638-652 Properties类 list&#xff1a;这个设备可以是一个流对象。 修改&#xff1a;如果该文件里没有Key&#xff0c;那即是创建&#xff0c;如果是有那就是修改。 继续坦克大战 防止敌人坦克重叠 满脑子都是今汐&#xff0c;亚达哟&#x1f62d;&#x1f62d;&#x1f6…

2, 搭建springCloud 项目 测试demo

上篇文章 新建了父依赖服务&#xff0c;这篇文章就建两个demo测试服务。 因为后面需要做服务间的通讯测试&#xff0c;所以至少需要建两个服务 建个子模块 同样的方式建连个demo服务 给java 和resources目录添加属性 在resources目录下建一个applications.yml文件&#xff0c;…

全志T527 CPU测试

一、基本介绍&#xff08;8核 A55&#xff09; 全志科技T527采用多核异构设计&#xff0c;集成了CPU、GPU、NPU、DSP、MCU等各种计算单元&#xff0c;为各种复杂场景的多任务处理、专用数据处理以及算法应用提供了高效且灵活的解决方案。 其中&#xff1a; T527集成了8核1.8…

嵌入式应用开发屏幕教程8080并口通信

目录 #8080相关概念介绍 #8080并行通信硬件连接部分 #并行通信硬件电路连接图 #并行通信读数据规定 #并行通信写数据规定 #8080相关概念介绍 通信协议分为串行通信协议&#xff0c;并行通信协议&#xff0c;而本章所讲的8080是一种并行通信协议&#xff0c;并行通信协议 Pa…

Redis支持多种数据类型,每种数据类型都有其独特的特点和适用场景。

Redis支持多种数据类型&#xff0c;每种数据类型都有其独特的特点和适用场景。以下是Redis的主要数据类型及其应用场景的详细介绍&#xff1a; 1. 字符串&#xff08;String&#xff09; 特点&#xff1a;Redis中的String是最基本的数据类型&#xff0c;可以存储二进制安全的…

Ubuntu安装、更新和删除软件

Ubuntu安装、更新和删除软件 问题命令行直接安装、更新和删除软件命令行直接安装软件命令行直接更新软件命令行直接删除软件 手动下载后命令行安装、更新和删除软件手动下载后命令行安装软件手动下载后命令行更新软件手动下载后命令行删除软件 手动下载后在桌面环境下安装、更新…

国标GB28181视频汇聚平台EasyCVR安防监控系统常见播放问题分析及解决方法

国标GB28181安防综合管理系统EasyCVR视频汇聚平台能在复杂的网络环境中&#xff0c;将前端设备统一集中接入与汇聚管理。平台支持多协议接入&#xff0c;包括&#xff1a;国标GB/T 28181协议、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视…

spring aop 初探

org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#wrapIfNecessary 分析JDK动态代理 生成的代理对象 构造函数&#xff0c;入参为 InvocationHandler public com.sun.proxy.$Proxy164(java.lang.reflect.InvocationHandler) 生成动态代理Class对象&…

C++ 因项目需求,需要将0~2的32次方这个区间的数字保存到内存当中(内存大小为4G),并且可以实现对任意一个数字的增删。(先叙述设计思路,再写岀代码)

问题&#xff1a; C 因项目需求&#xff0c;需要将0~2的32次方这个区间的数字保存到内存当中(内存大小为4G),并且可以实现对任意一个数字的增删。(先叙述设计思路&#xff0c;再写岀代码) 解答 设计思路代码实现说明 为了在有限的内存&#xff08;4GB&#xff09;中存储和操作 …

Linux——数据流和重定向,制作镜像

1. 数据流 标准输入&#xff08; standard input &#xff0c;简称 stdin &#xff09;&#xff1a;默认情况下&#xff0c;标准输入指从键盘获取的输入 标准输出&#xff08; standard output &#xff0c;简称 stdout &#xff09;&#xff1a;默认情况下&#xff0c;命令…

【保姆级详细介绍JavaScript初识及基本语法】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…