代码随想录打卡Day58

news2024/10/10 21:22:26

今天一共三道题,前两道看题解的,最后一道自己AC的,总体不算特别难。

110.字符串接龙

这道题没什么思路,直接看的题解,这道题用广度优先搜索是最合适的,这里我也明白了一个道理,到凡涉及到最短路径问题,用BFS是最合适的,要么就找不到,一旦找到了,就一定是最短的。这道题的字符串字典用unordered_set来实现,用来存储strList中的字符串。此外,本题还需要定义一个哈希表,键为字符串字典中的各个字符串,值为从beginStr到该字符串的最短距离,当然,这个哈希表会在遍历的过程中逐步完善,而不是一开始定义就是完善的。
从beginStr出发,进行广度优先搜索,具体来说,先将beginStr入队,然后使用一个while循环,当队列为空时循环终止,在队头的字符串出队后,代表遍历到该字符串current_word,依次遍历字符串的每一个位置,每个位置上的字母依次用26个小写字母替换,判断替换后是否等于endStr,如果相等的话就直接输出哈希表中存储的当前字符串对应的距离+1,并直接结束主函数流程,而过不等于endStr,再判断组成的新字符串new_word是否在unordered_set中出现过,如果出现了,再判断哈希表中是否存在这个键,如果已经存在,就说明这个字符串被重复访问了,这是不被允许的,此时应该什么都不做,如果这个字符串出现在unordered_set但是不在哈希表中,说明这个字符串是第一次被访问,应该向哈希表中添加这个键,对应的值为hash[current_word] + 1,并且及时将new_word加入队列。如果while循环结束了都没有到达终点,说明永远也到不了了,直接输出0即可。

#include<iostream>
#include<vector>
#include<string>
#include <unordered_set>
#include <unordered_map>
#include <queue>

using namespace std;

int main(){
    int N;
    cin >> N;  //N行strList中的字符串
    string beginStr, endStr;
    cin >> beginStr >> endStr;
    unordered_set<string> strSet;  //字符串字典
    string str;
    for(int i = 0; i < N; i++){
        cin >> str;
        strSet.insert(str);  //将字符串依次加入字符串字典
    }
    unordered_map<string, int> visitMap;  //键为字符串字典中的字符串,值为从beginStr出发到达这个字符串的长度
    //初始化队列
    queue<string> My_Queue;
    My_Queue.push(beginStr);
    //初始化哈希表
    visitMap[beginStr] = 1;
    //开始循环遍历寻找路径
    while(!My_Queue.empty()){
        string current_word = My_Queue.front();
        My_Queue.pop();
        int path = visitMap[current_word];  //记录当前所探索的路径
        for(int i = 0; i < current_word.size(); i++){
            string new_word = current_word;
            //试探当前所在的字符串能否只改动一个字符就到达endStr
            for(int j = 0; j < 26; j++){
                new_word[i] = 'a' + j;
                if(new_word == endStr){ //到达终点
                    cout << path + 1 << endl;
                    return 0;
                }
                if(strSet.find(new_word) != strSet.end()
                && visitMap.find(new_word) == visitMap.end()){
                    //在字符字典中出现,且从未被访问过
                    visitMap[new_word] = path + 1;
                    My_Queue.push(new_word);
                }
            }
            
        }
        
    }
    cout << 0 << endl;
    return 0;
}

105. 有向图的完全可达性

这道题目首先需要将图构建出来,由于涉及到状态转移,用邻接表来构建图是最合适的,用深度优先搜索和广度优先搜索都可以,这道题我用DFS来做。这道题的思路比较奇特,用dfs来做,先定义一个大小为N + 1的vector,其中下标1-N是我们要用到的,每到达一个节点,就将这个节点的值设置为true,说明从节点1出发,经过若干次转移可以到达当前节点,如果从节点1可以到达其他所有节点,则调用dfs函数后整个向量下标为1到下标为N的元素都应该为true。这道题的终止条件也很简单,当层层递归,到达的节点已经为true时,说明当前节点已经被访问过,再向下递归没有意义,因为还会再次回来,所以此时应该直接return ;否则将当前节点X标记为true,并跳转到X所能到达的其他节点。当递归结束以后,在主函数中检查下标从1到N的元素是否为true,只要出现一个false,就直接输出-1,并结束主函数,如果全为true,则在循环结束以后输出1.

#include<iostream>
#include<vector>
#include<list>
 
using namespace std;
 
void dfs(const vector<list<int>> &graph, int current, vector<bool> &visited);
 
int main(){
    int N, K;
    cin >> N >> K;  //N个节点,K条边
    vector<list<int>> graph(N + 1);  //用邻接表来表示有向图
    //构造有向图
    for(int i = 1; i <= K; i++){
        int s, t;
        cin >> s >> t;
        graph[s].push_back(t);  //可以从s号节点到达t节点(单向)
    }
    //初始化一个访问向量,未被访问过就为false
    vector<bool> visited(N + 1, false);
    dfs(graph, 1, visited);
    for(int i = 1; i < visited.size(); i++){
        if(!visited[i]){
            cout << -1 << endl;
            return 0;
        }
    }
    cout << 1 << endl;
    return 0;
}
 
//深度优先
void dfs(const vector<list<int>> &graph, int current, vector<bool> &visited){
    //终止条件,当前节点在之前就已经被访问过,则搜索停止
    if(visited[current]) return ;
    visited[current] = true;
    for(int next : graph[current])  //遍历节点current所能到达的下一个节点
        dfs(graph, next, visited);
}

106. 岛屿的周长

这道题思路并不难想,这道题我用的BFS。先讨论最一般的情况,假设矩阵中的岛屿为孤岛,四周已经被矩阵内的水域包围,直接调用bfs或者dfs函数将该岛屿探索出来,但是在探索的过程中需要额外对下一地点为水域的情况判断,假设当前地点的下一个地点为水域,则说明当前地点为岛屿边缘,对整个岛屿的周长是有贡献的,因此需要及时将周长C加一,如果当前地点的下一个地点为陆地,则说明当前地点在该探索方向上对周长是没有贡献的,这种情况下周长无需改动。下面讨论一种特殊的情况,就是岛屿在地图边缘,有些陆地在进行BFS时会出现访问越界的情况,这种情况下,不能再简单地跳过当前循环,由于当前访问的地点一定是陆地,在向某一个方向探索时出现了访问越界,则说明该地点也处于岛屿边缘,该地点在当前的探索方向上对周长也是有贡献的,应视同下一位置为水域,周长也应该加一。和之前的题目一样,在主函数中遍历整个地图,只要遇到未访问的陆地,则开始调用bfs函数,将当前陆地所在的整个岛屿探索出来,当函数调用结束后,岛屿探索完成,周长也随之统计完成,直接将C输出即可。

#include<iostream>
#include<vector>
#include<queue>

using namespace std;

vector<vector<int>> dirs = {
    {0, 1},  //向右
    {0, -1}, //向左
    {-1, 0}, //向上
    {1, 0}   //向下
};
int C = 0;  //周长

void bfs(const vector<vector<int>> &graph, vector<vector<bool>> &visited, int x, int y);

int main(){
    int N, M;
    cin >> N >> M;  //N行M列
    vector<vector<int>> graph(N, vector<int> (M));
    vector<vector<bool>> visited(N, vector<bool> (M, false));
    //构造地图矩阵
    for(int i = 0; i < N; i++){
        for(int j = 0; j < M; j++)
            cin >> graph[i][j];
    }
    for(int i = 0; i < N; i++){
        for(int j = 0; j < M; j++){
            if(graph[i][j] == 1 && !visited[i][j])
                //遇到岛屿,开始搜索
                bfs(graph, visited, i, j);
        }
    }
    cout << C << endl;
    return 0;
}

//广度优先搜索函数,调用时默认当前点为陆地
void bfs(const vector<vector<int>> &graph, vector<vector<bool>> &visited, int x, int y){
    queue<pair<int, int>> My_Queue;
    My_Queue.push({x, y});
    visited[x][y] = true;
    while(!My_Queue.empty()){
        pair<int, int> current = My_Queue.front();
        My_Queue.pop();
        for(auto dir : dirs){
            int next_x = current.first + dir[0];
            int next_y = current.second + dir[1];
            if(next_x < 0 || next_x >= graph.size() || next_y < 0 || next_y >= graph[0].size()){
                //越界访问 
                C++;
                continue;
            }
            if(graph[next_x][next_y] == 0)
                C++;
            if(graph[next_x][next_y] == 1 && !visited[next_x][next_y]){
                //下一个地点为未访问过的陆地
                My_Queue.push({next_x, next_y});
                visited[next_x][next_y] = true;
            }
        }
        
    }
    
    
}

离训练营结束又近一步,加油加油加油!!

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

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

相关文章

开源版GPT-4o来了!互腾讯引领风潮,开源VITA多模态大模型,开启自然人机交互新纪元[文末领福利]

目录 总览 VITA 模型的详细介绍 2.1 LLM 指令微调 2.2 多模态对齐 2.2.1 视觉模态 2.3 音频模态 多模态指令微调 3.1 训练数据 3.1.1 训练过程 模型部署&#xff1a;双工策略 4.1 非唤醒交互 4.2 音频中断交互 评估 5.1 语言表现 5.2 音频表现 5.3 多模态表现 …

离散微分几何中的网格(Meshes)

https://zhuanlan.zhihu.com/p/893338073 一、引言 ![](https://img-blog.csdnimg.cn/img_convert/c5e06e652822e0003cf6be91d26436b7.png) 在离散微分几何的广袤领域中&#xff0c;网格&#xff08;Meshes&#xff09;作为一个核心概念&#xff0c;犹如一座桥梁&#xff0c;…

小灰:从0到年入100万+,从程序员到自由职业者他经历了什么?

这是开发者说的第20期&#xff0c;这次给大家带来的畅销书《漫画算法》作者、自媒体创作者程序员小灰。 小灰做自媒体的时间已经有8年了&#xff0c;目前在全网有60w粉丝&#xff0c;同时《漫画算法》系列和《漫画ChatGPT》的书籍&#xff0c;在全网卖了12万册&#xff0c;靠写…

rocky9 samba共享

1. 安装samba服务&#xff0c;设置开机自启。 2. 创建四个用户user1&#xff0c;user2&#xff0c;sale1&#xff0c;manager&#xff0c;user1&#xff0c;user2属于finance组&#xff0c;sale1属于sales组&#xff0c;manager属于manager组。 3. 建立共享目录/opt/finance_…

模版进阶 非类型模版参数

一.模板参数分类类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将该参数当成常量来使用。 #i…

打印1000年到2000年之间的闰年

我们要打印1000年到2000年之间的闰年&#xff0c;首先我们先输出1000年到2000年之间的所有的年份&#xff0c;同时我们将闰年的判断方法输入到其中 闰年需要满足下列两个条件的其中之一&#xff1a; 1.能被4整除但不能被100整除 2.能被400整除 打印1000年到2000年之间的闰年…

PCL 贪婪三角投影三角化

目录 一、概述二、代码三、结果 一、概述 PCL中贪婪三角投影三角化的简单使用案例 二、代码 greedy_projection.cpp #include <pcl/point_types.h> #include <pcl/io/pcd_io.h> #include <pcl/search/kdtree.h> // for KdTree #include <pcl/features/…

【软件系统架构设计师-案例-1】架构风格

1. 请用200字以内说明系统可靠性的定义及包含的4个子特性&#xff0c;并简要指出提高系统可靠性一般采用哪些技术&#xff1f; &#xff08;1&#xff09;可靠性定义&#xff1a;系统在规定的时间或环境条件下&#xff0c;完成规定功能的能力&#xff0c;就是系统无故障运行的…

【AD速成】半小时入门AltiumDesigner(速通基础)

一.创建工程 1.工程 文件->新的->项目 PCB选择<Default>Project Name填入自己的工程名称Folder选择工程保存的路径 创建后如图&#xff1a; 这里的.prjPcb的文件即为AD的工程文件。 如果没有Project栏可以在视图->面板->Projects中勾选Projects CtrlS保存工…

Java学习-JVM调优

目录 1. JDK工具包 1.1 jps 1.2 jstat 1.3 jinfo 1.4 jmap 1.5 jhat 1.6 jstack 1.7 VisualVM 2. 第三方工具 2.1 GCEasy 2.2 MAT 2.3 Arthas 3. JVM参数 3.1 标准参数 3.2 非标准参数 3.3 不稳定参数 4. 调优 4.1 什么时候调优 4.2 调优调什么 4.3 调优原…

LINUX 系统管理操作

基础编辑 Tab 单击一次补全 双击列举候选 CTRL U 删除光标前 K 删除光标后 L 清屏&#xff08;只剩新命令行&#xff09; C 取消当前操作 反斜杠“\” 在需要转行的时候输入反斜杠 “\”回车 在>后继续输入 帮助命令 help 命令 大部分内建命令 格式&#xff1a;h…

直播预告 | 药品安全与合规保障难?智能温度监测助您领先制药工业4.0!

您是否在为温度敏感药品的运输和存储合规而苦恼&#xff1f; 是否担心冷链物流中的温度监控漏洞导致药品质量下降&#xff1f; 制药环境中的温湿度监控是否让您无从下手&#xff1f; 这些问题不仅影响药品的安全性&#xff0c;也直接影响企业的合规性和市场竞争力。如何确保环…

Android 保存图片到相册却不在“照片”中显示,只在相簿中显示

背景 需要从网络上下载图片到本地&#xff0c; 并显示在相册中 问题 将图片保存到内存中&#xff0c; 通过媒体API插入到媒体库后&#xff0c;图片只在“相簿”中的“所有项目”中显示&#xff0c;第一个页面的“照片”却不显示 解决办法 图片被保存到 Pictures/AppName 目录…

Linux系统通过编辑crontab来设置定时任务---定时关机

在Linux系统中&#xff0c;crontab 是用来设置周期性被执行的指令的守护进程。通过编辑 crontab&#xff0c;您可以安排定时任务&#xff0c;比如定时关机、定时备份文件、定时运行脚本等。以下是如何编辑 crontab 来设置定时任务的步骤&#xff1a; 打开终端&#xff1a;您可以…

基于springboot+vue的在线宠物用品交易网站

一、系统架构 前端&#xff1a;vue | element-ui | html 后端&#xff1a;springboot | mybatis-plus 环境&#xff1a;jdk1.8 | mysql | maven | nodejs 二、代码及数据库 三、功能介绍 01. web端-首页1 02. web端-首页2 03. web端-注册 04. web端-登录 05. w…

“万万没想到”,“人工智能”获得2024年诺贝尔物理学奖

近日&#xff0c;2024年诺贝尔物理学奖颁发给了机器学习与神经网络领域的研究者&#xff0c;这是历史上首次出现这样的情况。这项奖项原本只授予对自然现象和物质的物理学研究作出重大贡献的科学家&#xff0c;如今却将全球范围内对机器学习和神经网络的研究和开发作为了一种能…

SQLite Developer使用说明

1.SQLite Developer下载 SQLite Developer官方版是SharpPlus出品的一款数据库管理工具。支持对sqlite3数据库的管理&#xff0c;能够自动完成窗口显示和执行数据库命令等多种特色。并且支持打开.db文件&#xff0c;适用于Android的开发。另外&#xff0c;使用Sqlite Developer…

压缩包格式未知或损坏怎么办?四个简单修复步骤

压缩文件是我们日常工作中常用的工具&#xff0c;但有时在解压时会遇到提示“格式未知”或“压缩包已损坏”的情况。 这可能是由于下载不完整、文件传输错误、存储介质损坏等原因导致的。这种情况会影响到我们正常获取文件&#xff0c;尤其是当压缩包内含重要数据时更让人头疼…

跨境电商独立站||代码建站和SaaS建站的区别

代码建站和SaaS建站是两种不同的网站搭建方式&#xff0c;它们各有特点和适用场景&#xff1a; 1. 代码建站&#xff1a; 定义&#xff1a;指的是从零开始&#xff0c;使用HTML、CSS、JavaScript等编程语言编写代码来构建网站的过程。 技术要求&#xff1a;需要具备一定的编程知…

vue-自定义加载界面v-loading

在网络请求中&#xff0c;页面会出现空白&#xff0c;要使页面好看点&#xff0c;通常页面会出现一些加载页面 1.准备一个伪类元素需要&#xff0c;用伪类元素给加载界面装上蒙层 .loading:before{content:;position: absolute;left:0;top:0;width: 100%;height: 100%;backgrou…