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

news2024/11/15 21:26:21

1. 卡码网 110. 字符串接龙

题目链接:https://kamacoder.com/problempage.php?pid=1183
文章链接:https://www.programmercarl.com/kamacoder/0110.字符串接龙.html

在这里插入图片描述
思路:
本题只需要求出最短路径的长度就可以了,不用找出具体路径。
所以这道题要解决两个问题:

  • 图中的线是如何连在一起的
  • 起点和终点的最短路径长度
    首先题目中并没有给出点与点之间的连线,而是要我们自己去连,条件是字符只能差一个。
    所以判断点与点之间的关系,需要判断是不是差一个字符,如果差一个字符,那就是有链接。
    然后就是求起点和终点的最短路径长度,这里无向图求最短路,广搜最为合适,广搜只要搜到了终点,那么一定是最短的路径。因为广搜就是以起点中心向四周扩散的搜索。
    另外需要有一个注意点:
  • 本题是一个无向图,需要用标记位,标记着节点是否走过,否则就会死循环!
  • 使用set来检查字符串是否出现在字符串集合里更快一些
import java.util.*;

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(" ");
        
        List<String> wordList = new ArrayList<>();
        for (int i = 0; i < N; i++) {
            wordList.add(sc.nextLine());
        }
        
        // 打印结果
        int result = bfs(wordList,strs[0], strs[1]);
        System.out.println(result);
        
    }
    
    public static int bfs (List<String> wordList,String beginStr,String endStr) {
        Set<String> strSet = new HashSet<>(wordList);
        Map<String,Integer> resMap = new HashMap<>();
        Deque<String> deque = new ArrayDeque<>();
        deque.offer(beginStr);
        resMap.put(beginStr,1);
        
        while (!deque.isEmpty()) {
            String curWord = deque.poll();
            int path = resMap.get(curWord);
            
            // 对当前单词进行分析
            for (int i=0; i<curWord.length(); i++) {
                char[] wordArr = curWord.toCharArray();
                for (char k='a';k<='z';k++) {
                    wordArr[i]=k;
                    String temp = new String(wordArr);
                    
                    if (temp.equals(endStr)) {
                        return path+1;
                    }
                    if (strSet.contains(temp) && !resMap.containsKey(temp)) {
                        deque.offer(temp);
                        resMap.put(temp,path+1);
                    }//若resMap中存在temp,表示在此之前已经处理过该temp,要么同一层,要么更靠近核心,更短路径
                }
            }
        }
        
        return 0;
    }
}

卡码网 105.有向图的完全可达性

题目链接:https://kamacoder.com/problempage.php?pid=1177
文章链接:https://www.programmercarl.com/kamacoder/0105.有向图的完全可达性.html

在这里插入图片描述
思路:
本题有两种dfs的解法。
1.确认递归函数,参数
需要传入地图,需要知道当前我们拿到的key,以至于去下一个房间。
同时还需要一个数组,用来记录我们都走过了哪些房间,这样好知道最后有没有把所有房间都遍历的,可以定义一个一维数组。
2.确认终止条件
遍历的时候,什么时候终止呢?
a.若处理当前访问的节点:即在for循环之前处理节点,此时需要终止条件
当前访问的节点如果是 true ,说明是访问过的节点,那就终止本层递归,如果不是true,我们就把它赋值为true,因为这是我们处理本层递归的节点。

// 写法一:处理当前访问的节点
void dfs(const vector<list<int>>& graph, int key, vector<bool>& visited) {
    if (visited[key]) {
        return;
    }
    visited[key] = true;
    list<int> keys = graph[key];
    for (int key : keys) {
        // 深度优先搜索遍历
        dfs(graph, key, visited);
    }
}

b.若处理下一个要访问的节点:即在for循环内处理新节点,此时不需要终止条件
处理目前搜索节点出发的路径的时候对 节点进行处理。这样的话,就不需要终止条件,而是在 搜索下一个节点的时候,直接判断 下一个节点是否是我们要搜的节点。

// 写法二:处理下一个要访问的节点
void dfs(const vector<list<int>>& graph, int key, vector<bool>& visited) {
    list<int> keys = graph[key];
    for (int key : keys) {
        if (visited[key] == false) { // 确认下一个是没访问过的节点
            visited[key] = true;
            dfs(graph, key, visited);
        }
    }
}

3.处理目前搜索节点出发的路径
本题是需要判断 1节点 是否能到所有节点,那么我们就没有必要回溯去撤销操作了,只要遍历过的节点一律都标记上。
时候需要回溯操作呢?
当我们需要搜索一条可行路径的时候,就需要回溯操作了,因为没有回溯,就没法“调头”, 如果不理解的话,去看我写的 0098.所有可达路径 的题解。

import java.util.*;

public class Main {
    // static Map<Integer,List<Integer>> map = new HashMap<>();
    // public static void main (String[] args) {
    //     Scanner sc = new Scanner(System.in);
    //     int n=sc.nextInt();
    //     int k=sc.nextInt();
    //     int[] arr = new int[n+1];
        
    //     for (int i=0;i<k;i++) {
    //         int key=sc.nextInt();
    //         int value=sc.nextInt();
    //         List<Integer> list = map.getOrDefault(key,new ArrayList<>());
    //         list.add(value);
    //         map.put(key,list);
    //     }
    //     arr[1]=1;
    //     dfs(map.get(1),arr);
        
    //     for (int i=1;i<arr.length;i++) {
    //         if (arr[i]==0) {
    //             System.out.println(-1);
    //             return;
    //         }
    //     }
    //     System.out.println(1);
    // }
    
    // public static void dfs (List<Integer> list,int[] arr) {
    //     if (list==null) {
    //         return;
    //     }
        
    //     for (int i=0;i<list.size();i++) {//对当前可以到达的所有节点分别分析
    //         int cur = list.get(i);
    //         if (arr[cur] != 0) {
    //             continue;
    //         }
    //         arr[cur] = 1;
    //         dfs(map.get(cur),arr);
    //     }
    // }
    
    public static void main (String[] args) {
        Scanner sc = new Scanner(System.in);
        int n=sc.nextInt();
        int k=sc.nextInt();
        List<List<Integer>> list = new ArrayList<>(n+1);
        for (int i=0;i<=n;i++) {
            list.add(new ArrayList<>());
        }
        for (int i=0;i<k;i++) {
            int key=sc.nextInt();
            int value=sc.nextInt();
            list.get(key).add(value);
        }
        boolean[] visted = new boolean[n+1];
        dfs(list,visted,1);
        
        for (int i=1;i<visted.length;i++) {
            if (visted[i]==false) {
                System.out.println(-1);
                return;
            }
        }
        System.out.println(1);
        
    }
    
    public static void dfs (List<List<Integer>> list,boolean[] visted,int key) {
        // 检查是否被访问过
        if (visted[key]) {
            return;
        }
        visted[key]=true;
        // 对当前可以到达的所有节点分别分析
        for (int i:list.get(key)) {
            dfs(list,visted,i);
        }
    }
}

卡码网 106.岛屿的周长

题目链接:https://kamacoder.com/problempage.php?pid=1178
文章链接:https://www.programmercarl.com/kamacoder/0106.岛屿的周长.html

在这里插入图片描述
思路:
遍历每一个空格,遇到岛屿则计算其上下左右的空格情况。
1.如果该陆地上下左右的空格是有水域,则说明是一条边;
2.如果该陆地上下左右的空格出界了,则说明是一条边。

import java.util.*;

public class Main {
    static int[][] dr = new int[][]{{1,0},{-1,0},{0,1},{0,-1}};
    static int c=0;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(); // 行
        int m = sc.nextInt(); // 列
        int[][] matrix = new int[n][m];
        for (int i=0;i<n;i++) {
            for (int j=0;j<m;j++) {
                matrix[i][j] = sc.nextInt();
            }
        }
        boolean[][] visted = new boolean[n][m];
        for (int i=0;i<n;i++) {
            for (int j=0;j<m;j++) {
                // 检查是否是未被访问的陆地
                if (matrix[i][j]==1&&visted[i][j]==false) {
                    dfs(matrix,visted,i,j);
                }
            }
        }
        System.out.println(c);
    }
    
    public static void dfs(int[][] matrix,boolean[][] visted,int x,int y) {
        // 检查是否是海洋或者已被访问
        if (matrix[x][y]==0||visted[x][y]) {
            return;
        }
        visted[x][y] = true;
        for (int i=0;i<4;i++) {
            int nextx = x+dr[i][0];
            int nexty = y+dr[i][1];
            // 检查是否越界
            if (nextx<0||nextx>=matrix.length||nexty<0||nexty>=matrix[0].length) {
                c++;
                continue;
            }
            if (matrix[nextx][nexty]==0) {
                c++;
            }
            dfs(matrix,visted,nextx,nexty);
        }
       
    }    
}

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

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

相关文章

解决面板安装Node.js和npm后无法使用的问题

使用面板&#xff08;BT&#xff09;安装Node.js和npm后&#xff0c;可能会遇到如下问题&#xff1a;即使成功安装了Node.js和npm&#xff0c;服务器仍提示“未安装”&#xff0c;在命令行中使用 node -v 或 npm -v 也没有任何响应。这种问题通常是由于环境变量配置错误或路径问…

Matlab中BaseZoom()函数实现曲线和图片的局部放大

BaseZoom工具下载链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1yItVSinh6vU4ImlbZW6Deg?pwd9dyl 提取码&#xff1a;9dyl 下载完之后将工具包放置合适的路径下&#xff0c;并在matlab中“设置路径”中添加相应的路径&#xff1b; 注&#xff1a;可以先运行如…

【C++ Primer Plus习题】12.2

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include "String.h"…

指针与一维数组

对于数组元素的访问&#xff0c;可以使用下标&#xff0c;也可以使用指针变量&#xff0c;移动指针可以指向数组中的任意一个元素。 例如&#xff0c;一维数组和指针的如下定义 int a [5] {1,2,3,4,5},*p;p a; 因为p是指向一维数组的首元素的指针。因此上述关系等价于 int…

第三天旅游线路规划

第三天&#xff1a;从贾登峪到禾木风景区&#xff0c;晚上住宿贾登峪&#xff1b; 从贾登峪到禾木风景区入口&#xff1a; 1、行程安排 根据上面的耗时情况&#xff0c;规划一天的行程安排如下&#xff1a; 1&#xff09;早上9&#xff1a;00起床&#xff0c;吃完早饭&#…

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录 [web][极客大挑战 2019]Http 考点&#xff1a;Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点&#xff1a;弱密码字典爆破 四种方法&#xff1a; [web][极客大挑战 2019]Http 考点&#xff1a;Referer协议、UA协议、X-Forwarded-For协议 访问…

matlab读取NC文件(含group)

matlab读取NC文件&#xff08;含group&#xff09;&#xff1a; NC文件数据结构&#xff1a; 代码&#xff1a; % 打开 NetCDF 文件 filename your_file.nc; % 替换为你的文件名% 使用 netcdf.open 函数打开文件 ncid netcdf.open(filename, NC_NOWRITE);% 查看文件中的组 …

JAVA - 关于防重复提交探讨

1、前端提交按钮做单次点击 2、后端接收判断请求的数据包&#xff0c;生成唯一key存redis&#xff0c;设置几秒的过期时间&#xff08;缺陷&#xff1a;带时间戳的数据&#xff0c;需要做些逻辑判断&#xff09; 3、后端代码逻辑redis分布式锁&#xff08;缺陷&#xff1a;re…

说一下解除docker限制内存警告

有时候docker要对容器使用的内存做出限制&#xff0c;通常的做法是使用参数 -m 例如&#xff1a; docker run -m 512M表示容器内存最大不能超过512M。 但这样做&#xff0c;在ubuntu会看到以下警告 WARNING: Your kernel does not support swap limit capabilitiesdocker官方…

ELK笔记

要搞成这样就需要钱来买服务器 开发人员一般不会给服务器权限&#xff0c;不能到服务器上直接看日志&#xff0c;所以通过ELK看日志。不让开发登录服务器。即使你查出来是开发的问题&#xff0c;费时间&#xff0c;而且影响了业务了&#xff0c;就是运维的问题 开发也不能登录…

从零开始学习JVM(七)- StringTable字符串常量池

1 概述 String应该是Java使用最多的类吧&#xff0c;很少有Java程序没有使用到String的。在Java中创建对象是一件挺耗费性能的事&#xff0c;而且我们又经常使用相同的String对象&#xff0c;那么创建这些相同的对象不是白白浪费性能吗。所以就有了StringTable这一特殊的存在&…

用EA和SysML一步步建模(05)使命声明-解构需求01

用EA和SysML一步步建模的操作指南&#xff08;01&#xff09; 用EA和SysML一步步建模&#xff08;02&#xff09;导入ISO-80000 用EA和SysML一步步建模&#xff08;03&#xff09;创建包图和包的关系 用EA和SysML一步步建模&#xff08;04&#xff09;创建“需求组织”包图 …

【PHPStudy搭建Pikachu靶场】自定义网站站点和mysql端口本地搭建Pikachu靶场

文章目录 1. 下载phpstudy和pikaqu源码2. 打开phpstudy&#xff0c;启用apache和mysql3. Phpstudy用自定义的82端口创建网站4. 创建数据库5. 修改apache的端口和网站根目录6. 修改mysql的端口和服务序列号7. 用浏览器打开靶场8. 修改pikachu的config.inc.php文件9. 在浏览器上打…

一些硬件知识(十八)

两个信号PIN之间串接电阻的作用&#xff1a; 1.阻抗匹配 2.吸收反射 3.防止程序异常导致两个IO都是输出的时候短路 尤其针对下图中的信号&#xff1a; 清理穿越机电机中的灰尘&#xff0c;可以用密封胶泥的办法&#xff1a; 一定要小心垫片的掉落&#xff1a; 20块左右的快充充…

魔术方法介绍

目录 一、基本介绍 1、什么是魔术方法 2、常见的魔术方法 二、__str__ 1、基本介绍 2、应用实例&#xff1a;请输出Monster对象的属性信息 三、__eq__ 1、基本介绍 2、应用实例 四、其它几个魔术方法 1、其它魔术方法 2、应用实例 参考文档&#xff1a;3. 数据模型…

SOMEIP_ETS_096: SD_Check_TCP_Connection_before_SubscribeEventgroup

测试目的&#xff1a; 验证DUT&#xff08;Device Under Test&#xff09;在未事先建立TCP连接的情况下&#xff0c;对于包含TCP端点选项的SubscribeEventgroup请求&#xff0c;能够拒绝该请求并发送SubscribeEventgroupNAck。 描述 本测试用例旨在确保DUT遵循SOME/IP协议&a…

堆排序Java

思路 这个代码还不错 https://blog.csdn.net/weixin_51609435/article/details/122982075 就是从下往上进行调整 1. 如何将数组映射成树 对于下面这颗树&#xff0c;原来的数组是&#xff1a; 好&#xff0c;如果调整的话&#xff0c;我们第一个应该调整的是最下边&#x…

JVM面试真题总结(三)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 解释-下Full GC? Full GC&#xff0c;也被称为Major GC&#xff…

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操…

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节&#xff0c;字符串小于等于15直接保存在栈上&#xff0c;超过之后才会使用new分配。