当前位置: 首页 > news >正文

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

学习资料:代码随想录

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;
}

相关文章:

  • linux中如何修改文件的权限和拥有者所属组
  • Web纯前端实现在线打开编辑保存PPT幻灯片
  • 第四章:ESP32零基础教学 - 4.2继电器、舵机与L298N电机
  • web客户端存储,IndexDB相关讲解
  • 【实战指南】用MongoDB存储文档和图片等大文件(Java实现)
  • 破解内存瓶颈:如何通过内存池优化资源利用
  • 【算法day18】有效的括号——给定一个只包括 ‘(‘,‘)‘,‘{‘,‘}‘,‘[‘,‘]‘ 的字符串 s ,判断字符串是否有效。
  • 【第14届蓝桥杯C/C++B组省赛】01串的熵
  • PCA Jittering 图像增强
  • 【通过Groovy去热修复线上逻辑】1.执行线上数据修复 2.写工具
  • 仿函数 VS 函数指针实现回调
  • RAG现有技术方案
  • 【Golang】defer与recover的组合使用
  • PyCharm中使用pip安装PyTorch(从0开始仅需两步)
  • 设计和布局硬件电路是嵌入式系统开发的重要环节
  • 3.22日西南竞篮,NBA勇士VS老鹰,赛前数据前瞻
  • LeetCode 2643.一最多的行:模拟(更新答案)
  • Wispr Flow,AI语言转文字工具
  • 鸿蒙NEXT开发案例:程序员计算器
  • 使用若依AI生成springBoot的前后端分离版本
  • 人民日报:应对外贸行业风险挑战,稳企业就是稳就业
  • 杭州打造商业航天全产业链,请看《浪尖周报》第22期
  • 2025上海浪琴环球马术冠军赛开赛在即,首批赛马今晨抵沪
  • 知名计算机专家、浙江大学教授张森逝世
  • 海南高院通报去年知产领域司法保护状况:审结民事一审案件4847起
  • 国防部:希望美方不要有“受迫害妄想症”,总拿别人当借口