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

devtools/2025/3/28 13:18:09/

学习资料:代码随想录

110. 字符串接龙

卡码网题目链接(ACM模式)

还是有些许复杂,要把字符串从begin开始遍历,然后把每一个字母都换一下,看能否在字典里找到,如果能找到就入队列并记录,一直到最后。因为是广度优先,所以最先找到的就是最短的距离

#include <iostream>
#include <queue>
#include <unordered_map>
#include <unordered_set>
using namespace std;int main(){int n;cin>>n;string beginStr,endStr;cin>>beginStr>>endStr;unordered_set<string> strList;string str;for(int i=0;i<n;i++){cin>>str;strList.insert(str);}queue<string> que;que.push(beginStr);unordered_map<string,int> visited;visited.insert(pair<string,int>(beginStr,1));while(!que.empty()){string curString = que.front();que.pop();int path = visited[curString];for(int i=0;i<curString.size();i++){string newWord=curString;for(int j=0;j<26;j++){char x=j+'a';newWord[i]=x;if(newWord==endStr){cout<<path+1<<endl;return 0;}if(strList.find(newWord)!=strList.end()&&visited.find(newWord)==visited.end()){visited[newWord]=path+1;que.push(newWord);}}}}cout<<0<<endl;
}

105.有向图的完全可达性

卡码网题目链接(ACM模式)

到有向图了,这道题其实还是搜索一遍看能不能搜索到

邻接表存储有向图

深搜处理当前节点:

#include <iostream>
#include <vector>
#include <list>
using namespace std;void dfs(const vector<list<int>>& graph,vector<bool>& visited,int k){if(visited[k]==true) return;visited[k]=true;list<int> keys=graph[k];for(int key:keys){dfs(graph,visited,key);}
}
int main(){int n,k;cin>>n>>k;vector<list<int>> graph(n+1);int s,t;for(int i=0;i<k;i++){cin>>s>>t;graph[s].push_back(t);}vector<bool> visited(n+1,false);dfs(graph,visited,1);               //从1出发for(int i=1;i<n+1;i++){if(visited[i]==false){cout<<-1<<endl;return 0;}}cout<<1<<endl;
}

深搜处理下一节点

#include <iostream>
#include <vector>
#include <list>
using namespace std;void dfs(const vector<list<int>>& graph,vector<bool>& visited,int k){list<int> keys=graph[k];for(int key:keys){if(visited[key]==false){dfs(graph,visited,key);visited[key]=true;}}
}
int main(){int n,k;cin>>n>>k;vector<list<int>> graph(n+1);int s,t;for(int i=0;i<k;i++){cin>>s>>t;graph[s].push_back(t);}vector<bool> visited(n+1,false);visited[1]=true;dfs(graph,visited,1);               //从1出发for(int i=1;i<n+1;i++){if(visited[i]==false){cout<<-1<<endl;return 0;}}cout<<1<<endl;
}

广搜:

#include <iostream>
#include <vector>
#include <list>
#include <queue>
using namespace std;void bfs(const vector<list<int>>& graph,vector<bool>& visited,int k){queue<int> que;que.push(k);visited[k]=true;while(!que.empty()){int cur=que.front();que.pop();list<int> keys=graph[cur];for(int key:keys){if(visited[key]==false){que.push(key);visited[key]=true;      //谨记卡哥说的push后立马记录}}}}
int main(){int n,k;cin>>n>>k;vector<list<int>> graph(n+1);int s,t;for(int i=0;i<k;i++){cin>>s>>t;graph[s].push_back(t);}vector<bool> visited(n+1,false);bfs(graph,visited,1);               //从1出发for(int i=1;i<n+1;i++){if(visited[i]==false){cout<<-1<<endl;return 0;}}cout<<1<<endl;
}

106. 岛屿的周长

卡码网题目链接(ACM模式)

并不需要深搜或广搜了,直接暴力

1、检查每一个陆地单元的靠水的边

#include <iostream>
#include <vector>
using namespace std;
int dir[4][2]={0,1,-1,0,0,-1,1,0};int main(){int n,m;cin>>n>>m;vector<vector<int>> fiji(n,vector<int>(m,0));for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>fiji[i][j];}}int result =0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(fiji[i][j]==1){for(int k=0;k<4;k++){       //我怎么就想不到呢,每个节点都分别计算四个边啊int xnext = i+dir[k][0];int ynext = j+dir[k][1];if(xnext<0||xnext>=fiji.size()||ynext<0||ynext>=fiji[0].size()||fiji[xnext][ynext]==0){result++;}}            }}}cout<<result<<endl;
}

2、先计算所有陆地单元的数量,然后减去重复周长

#include <iostream>
#include <vector>
using namespace std;int main(){int n,m;cin>>n>>m;vector<vector<int>> fiji(n,vector<int>(m,0));for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>fiji[i][j];}}int sum=0;int repeat=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(fiji[i][j]==1){sum+=4;if(i-1>=0&&fiji[i-1][j]==1) repeat+=2;   //重复一次少的是两个边if(j-1>=0&&fiji[i][j-1]==1) repeat+=2;//只刨除上面和左面的重复部分,避免重复计算}}}int result = sum-repeat;cout<<result<<endl;
}


http://www.ppmy.cn/devtools/170580.html

相关文章

常考计算机操作系统面试习题(三下)

20. 请求页式存储管理系统缺页率计算 题目&#xff1a; 假设一个作业的页面走向为 1、2、3、4、1、2、5、1、2、3、4、5&#xff0c;当分配给该作业的物理块数分别为 3 和 4 时&#xff0c;计算采用下述页面置换算法的缺页率&#xff1a; (1) 先进先出&#xff08;FIFO&…

华为NAS真实测评!

外观&#xff1a;简约科技风&#xff0c;小身材大容量✨ 华为 NAS 整体设计走简约科技风&#xff0c;机身小巧精致&#xff0c;不管是放在书房书桌还是客厅电视柜旁&#xff0c;都超和谐&#xff0c;完美融入各种家居环境。它的材质质感超棒&#xff0c;摸起来很有档次。在存储…

用 pytorch 从零开始创建大语言模型(六):预训练无标注数据

用 pytorch 从零开始创建大语言模型&#xff08;六&#xff09;&#xff1a;预训练无标注数据 6 微调用于分类6.1 微调的不同类别6.2 准备数据集6.3 创建数据加载器6.4 使用预训练权重初始化模型6.5 添加分类头部6.6 计算分类损失和准确率6.7 在监督数据上微调模型6.8 使用LLM…

【Linux】进程信号(上)

引言 在Linux系统中&#xff0c;信号机制是实现进程间异步通信的重要方式&#xff0c;其生命周期可分为三个关键阶段&#xff1a;信号产生→信号保存→信号处理。这种机制如同我们生活中的红绿灯系统&#xff1a;信号随时可能异步产生&#xff08;红灯亮起&#xff09;&#x…

Java 中的多线程:核心概念与应用场景

在 Java 编程世界里&#xff0c;多线程是提升程序性能和响应性的强大工具。理解多线程的核心概念和应用场景&#xff0c;能让开发者编写出更高效、更灵活的代码。 多线程允许程序同时执行多个任务。比如在一个音乐播放软件中&#xff0c;播放音乐、显示歌词、处理用户操作等任务…

SpringCloud Gateway 集成 Sentinel 详解 及实现动态监听Nacos规则配置实时更新流控规则

目录 一、前言二、版本选择和适配 2.1、本文使用各组件版本2.2、官方推荐版本 三、部署sentinel-dashboard 3.1、下载 sentinel-dashboard jar包3.2、启动 sentinel-dashboard 四、Gateway 集成 Sentinel实现控制台配置流控规则测试 4.1、添加Gateway 集成 Sentinel 包4.2、添加…

vue-splice方法

一、代码解析 语法结构 splice(index, deleteCount, newElement) 是 JavaScript 数组的变异方法&#xff0c;其参数含义为&#xff1a; • index&#xff1a;操作的起始位置&#xff08;索引&#xff09;。 • 1&#xff1a;删除的元素数量&#xff08;此处删除 1 个元素&#…

Flink 内存管理

一、内存模型 上图是一个 Flink 程序进程总体的内存模型,其包含 Flink 使用内存、JVM 元空间以及 JVM 开销。 Flink 使用了堆上内存和堆外内存;框架内存使用了堆上内存和堆外内存的直接内存;Task 使用堆上内存和堆外内存的直接内存;管理内存、JVM 元空间以及 JVM 内存开销使…