代码随想录Day67(图论 part04)

110.字符串接龙

题目:110. 字符串接龙 (kamacoder.com)

思路:没有思路

答案
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        int n = scanner.nextInt();
        String beginStr = scanner.next();
        String endStr = scanner.next();
        
        Set<String> strSet = new HashSet<>();
        for (int i = 0; i < n; i++) {
            strSet.add(scanner.next());
        }
        
        System.out.println(findShortestTransformation(beginStr, endStr, strSet));
    }

    private static int findShortestTransformation(String beginStr, String endStr, Set<String> strSet) {
        // 记录strSet里的字符串是否被访问过,同时记录路径长度
        Map<String, Integer> visitMap = new HashMap<>();
        
        // 初始化队列
        Queue<String> queue = new LinkedList<>();
        queue.add(beginStr);
        
        // 初始化visitMap
        visitMap.put(beginStr, 1);

        while (!queue.isEmpty()) {
            String word = queue.poll();
            int pathLength = visitMap.get(word); // 这个字符串在路径中的长度
            
            // 开始在这个str中,挨个字符去替换
            for (int i = 0; i < word.length(); i++) {
                char[] newWordArray = word.toCharArray();
                
                // 遍历26个字母
                for (char j = 'a'; j <= 'z'; j++) {
                    newWordArray[i] = j;
                    String newWord = new String(newWordArray);
                    
                    if (newWord.equals(endStr)) { // 发现替换字母后,字符串与终点字符串相同
                        return pathLength + 1; // 找到了路径
                    }
                    
                    // 字符串集合里出现了newWord,并且newWord没有被访问过
                    if (strSet.contains(newWord) && !visitMap.containsKey(newWord)) {
                        // 添加访问信息,并将新字符串放到队列中
                        visitMap.put(newWord, pathLength + 1);
                        queue.add(newWord);
                    }
                }
            }
        }
        
        // 没找到输出0
        return 0;
    }
}
小结
  • 使用  Set<String>   存储字符串
  • 使用  Map<String, Integer>  记录是否访问过,以及路径长度
  • 通过queue来存储遍历过的字符串,从beginStr开始,每次替换一个字符,要是替换后的字符串存在于set中,就将该字符串记录为已访问,并将字符串放入到queue中

105.有向图的完全可达性

题目:105. 有向图的完全可达性 (kamacoder.com)

思路:从1出发,进行深搜,走完所有路径,看是否能够到达所有节点

尝试(运行出错)
import java.util.*;
 
public class Main {
    private static List<List<Integer>> adjList;
    private static List<List<Integer>> allPaths;
    private static int target;
 
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        
        adjList = new ArrayList<>();
        for (int i = 0; i < n + 1; i++) {
            adjList.add(new ArrayList<>());
        }
        
        for (int i = 0; i < m; i++) {
            int s = scanner.nextInt();
            int t = scanner.nextInt();
            adjList.get(s).add(t);
        }
        
        
        for(int i =2; i<=n; i++){
            target = i;
            allPaths = new ArrayList<>();
            List<Integer> currentPath = new ArrayList<>();
            currentPath.add(1);
            findAllPaths(1, currentPath);
            if(allPaths.isEmpty()){
                 System.out.println("-1");
            }
        }
         System.out.println("1");
        
        scanner.close();
    }
    
    private static void findAllPaths(int currentNode, List<Integer> currentPath) {
        if (currentNode == target) {
            allPaths.add(new ArrayList<>(currentPath));
            return;
        }
        
        for (int nextNode : adjList.get(currentNode)) {
            currentPath.add(nextNode);
            findAllPaths(nextNode, currentPath);
            currentPath.remove(currentPath.size() - 1);
        }
    }
    

}
答案
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt(); // 节点数量
        int m = scanner.nextInt(); // 边的数量

        // 节点编号从1到n,所以申请 n+1 这么大的数组
        List<List<Integer>> graph = new ArrayList<>(n + 1);
        for (int i = 0; i <= n; i++) {
            graph.add(new ArrayList<>());
        }

        // 读取边的信息并构建邻接表
        for (int i = 0; i < m; i++) {
            int s = scanner.nextInt();
            int t = scanner.nextInt();
            graph.get(s).add(t);
        }

        // 初始化访问数组
        boolean[] visited = new boolean[n + 1];
        dfs(graph, 1, visited);

        // 检查是否所有节点都被访问到了
        for (int i = 1; i <= n; i++) {
            if (!visited[i]) {
                System.out.println(-1);
                return;
            }
        }
        System.out.println(1);
    }

    private static void dfs(List<List<Integer>> graph, int node, boolean[] visited) {
        if (visited[node]) {
            return;
        }
        visited[node] = true;
        for (int neighbor : graph.get(node)) {
            dfs(graph, neighbor, visited);
        }
    }
}
小结

通过递归, 把所有路径跑一遍, 之后再检查是否所有的节点都有被访问到, 此处不需要回溯

106.岛屿的周长

题目:106. 岛屿的周长 (kamacoder.com)

思路:逐个遍历1,计算每个1跟临近的0所形成的边界,加起来,就是周长

尝试(示例输出正确,提交后输出错误)
import java.util.*;

class Main{
    public static int n;
    public static int m;
    public static int[][] grid;
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        m = scanner.nextInt();
        grid = new int[n][m];
        
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                grid[i][j] = scanner.nextInt();   
            }
        }
        int maxArea = 0;
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                maxArea+=count(i,j);   
            }
        }
        System.out.println(maxArea);
    }
    public static int count(int i,int j){
        if(grid[i][j]!=1) return 0;
        int len = 0;
        if(grid[i-1][j]==0){
            len++;
        }
        if(grid[i+1][j]==0){
            len++;
        }
        if(grid[i][j-1]==0){
            len++;
        }
        if(grid[i][j+1]==0){
            len++;
        }
        return len;
    }
}
答案
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt(); // 行数
        int m = scanner.nextInt(); // 列数

        int[][] grid = new int[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                grid[i][j] = scanner.nextInt();
            }
        }

        int landCount = 0; // 陆地数量
        int neighborCount = 0; // 相邻陆地的数量

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (grid[i][j] == 1) {
                    landCount++; // 统计总的陆地数量
                    // 统计上边相邻陆地
                    if (i - 1 >= 0 && grid[i - 1][j] == 1) neighborCount++;
                    // 统计左边相邻陆地
                    if (j - 1 >= 0 && grid[i][j - 1] == 1) neighborCount++;
                    // 下边和右边的相邻陆地不统计是为了避免重复计算
                }
            }
        }

        // 计算岛屿的周长
        int perimeter = landCount * 4 - neighborCount * 2;
        System.out.println(perimeter);
    }
}
小结

注意每次只统计上边和左边的相邻陆地

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

简单分享 for循环,从基础到高级

1. 基础篇&#xff1a;Hello, For Loop! 想象一下&#xff0c;你想给班上的每位同学发送“Hello!”&#xff0c;怎么办&#xff1f;那就是for循环啦&#xff0c; eg&#xff1a;首先有个名字的列表&#xff0c;for循环取出&#xff0c;分别打印 names ["Alice", …

Firefox 编译指南2024 Windows10篇- 编译Firefox(三)

1.引言 在成功获取了Firefox源码之后&#xff0c;下一步就是将这些源码编译成一个可执行的浏览器。编译是开发流程中的关键环节&#xff0c;通过编译&#xff0c;我们可以将源代码转换为可执行的程序&#xff0c;测试其功能&#xff0c;并进行必要的优化和调试。 对于像Firef…

Datawhale - 角色要素提取竞赛

文章目录 赛题要求一、赛事背景二、赛事任务三、评审规则1.平台说明2.数据说明3.评估指标4.评测及排行 四、作品提交要求五、 运行BaselineStep1&#xff1a;下载相关库Step2&#xff1a;配置导入Step3&#xff1a;模型测试Step4&#xff1a;数据读取Step5&#xff1a;Prompt设…

不要再被骗了!电脑无法进入系统的原因可能是这个硬件坏了而已……

前言 前段时间小白在抖音上发了很多很多很多的视频&#xff0c;其中应该是有很多商家关注了小白。 然后就会出现很多很多很多的赚钱小门道…… 电脑开机没有显示&#xff1f;换显卡&#xff01; 电脑还是不开机&#xff1f;换CPU 电脑还是一样不开机…… 经过了一番大折腾…

电脑录音方法:电脑怎么录音?5招轻松搞定录音!

想要从麦克风或系统音频录制电脑声音吗&#xff1f;这是一项简单的任务。本文将为您介绍5种最佳且最简单的方法&#xff0c;包括使用Windows系统自带的录音工具来录制电脑音频&#xff0c;在线音频录音软件和专业的第三方电脑录音软件。这些工具都能够很好地帮助您完成电脑怎么…

【深度学习】循环神经网络RNN、LSTM、GRU

李宏毅深度学习笔记 https://www.bilibili.com/video/BV1qM4y1M7Nv RNN 在 RNN 里面&#xff0c;每一次隐藏层的神经元产生输出的时候&#xff0c;该输出会被存到记忆元。下一次有输入时&#xff0c;这些神经元不仅会考虑输入 x1, x2&#xff0c;还会考虑存到记忆元里的值。 …

高危行业的安全守护者,顶坚防爆手机无惧挑战

高危行业的安全守护者&#xff0c;防爆手机以卓越性能&#xff0c;无惧极端挑战&#xff0c;为每一位前线工作者筑起坚不可摧的安全防线。石油勘探的深邃海洋、化工生产的复杂车间、矿山的幽深隧道……这些高危行业中&#xff0c;每一步都需谨慎前行&#xff0c;每一刻都需安全…

技术成神之路:设计模式(二)建造者模式

1.定义 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它允许你分步骤创建复杂对象&#xff0c;而不必直接调用构造函数。建造者模式特别适合那些包含多个组成部分并且构造过程复杂的对象。 2. 结构 建造者模式的主要组成部分包括&#…

TensorRT动态形状(Dynamic Shape)出错,官方demo+自己模型运行时出错

(2024.7.2) 使用TensorRT处理动态输入形状推理时出现的错误&#xff0c;本案基于官方demo文件&#xff0c;已解决&#xff1a; TensorRT版本10.0&#xff0c;官方例子使用的是这个https://github.com/NVIDIA/trt-samples-for-hackathon-cn/blob/master/cookbook/01-SimpleDem…

数据文件传输连接超时?镭速教你如何解决!

Mysql作为一个广泛使用的开源关系型数据库管理系统&#xff0c;以快速、可靠、易于使用、开源的特色闻名&#xff0c;使用 MySQL 来存储和管理数据&#xff0c;已经广泛应用于各个领域、各类大小型应用中。 图片源于网络 使用 MySQL 来存储和管理数据的应用中&#xff0c;与数…

Windows打开redis以及Springboot整合redis

目录 前言Windows系统打开redisSpringboot整合redis依赖实体类yml配置文件config配置各个数据存储类型分别说明记录string数据写入redis&#xff0c;并查询通过命令行查询 list插入数据到redis中从redis中读取命令读取数据 hash向redis中逐个添加map键值对获取key对应的map中所…

【ubuntu18.04】 局域网唤醒 wakeonlan

ai服务器经常因为断电,无法重启,当然可以设置bios 来电启动。 这里使用局域网唤醒配置。 自动开关机设置 工具:ethtool 端口 : enp4s0 Wake-on: d 表示禁用Wake-on: g 激活 ,例如:ethtool -s eth0 wol g 配置/etc/rc.local ,这个文件不存在,自己创建工具下载 tengxun W…

mysql 命令 —— 查看表信息(show table status)

查询表信息&#xff0c;如整个表的数据量大小、表的索引占用空间大小等 1、查询某个库下面的所有表信息&#xff1a; SHOW TABLE STATUS FROM your_database_name;2、查询指定的表信息&#xff1a; SHOW TABLE STATUS LIKE your_table_name;如&#xff1a;Data_length 显示表…

开放式耳机哪个品牌最好?2024高热度机型推荐,选购不迷茫

选购开放式耳机时&#xff0c;面对琳琅满目的品牌与型号是否感到不知道怎么选择&#xff1f;别担心&#xff0c;作为耳机爱好者与资深评测人&#xff0c;我精心整理了几款热门开放式耳机的全面对比。这次对比不仅涵盖如何挑选&#xff0c;有哪些不要菜类的额点&#xff0c;还推…

第十四届蓝桥杯省赛C++B组E题【接龙数列】题解(AC)

需求分析 题目要求最少删掉多少个数后&#xff0c;使得数列变为接龙数列。 相当于题目要求求出数组中的最长接龙子序列。 题目分析 对于一个数能不能放到接龙数列中&#xff0c;只关系到这个数的第一位和最后一位&#xff0c;所以我们可以先对数组进行预处理&#xff0c;将…

数字化供应链:背景特点

​背景 1、外部环境 近年来&#xff0c;供应链脆弱性凸显&#xff0c;企业供应链压力难以缓解。 美国媒体针对美国零售联合会、美国服装和鞋类协会、美国供应链管理专业委员会等主体进行的一项供应链调查显示&#xff1a; 61%的供应链经理预计&#xff0c;供应链紊乱问题至少…

老师怎样将期末成绩怎样私发家长?

作为老师&#xff0c;期末成绩的发布不仅是对学生一学期学习成果的评价&#xff0c;更是家校沟通的重要环节。然而&#xff0c;这一过程往往比我们想象的更为复杂和繁琐。 我们需要确保每个学生的成绩准确无误。这意味着在成绩录入之后&#xff0c;必须进行多次核对&#xff0c…

Java将list数组中重复的对象进行去重

/*** 数组去重*/ public class ArrayDistinct {public static void main(String[] args) {ArrayList<Object> list new ArrayList<>();JSONObject jsonObject1 new JSONObject();jsonObject1.put("name","张三");jsonObject1.put("age&…

序号不足两位前面补0

预期目标 原始效果 代码实现 {${(index 1).toString().padStart(2, 0)}. ${item.sentence}}要实现自动编号并确保显示为两位数的格式&#xff0c;可以在 {index 1} 的地方进行格式化。在 JavaScript 中&#xff0c;可以使用 String.prototype.padStart() 方法来补足数字到指定…

终极指南:RNNS、Transformers 和 Diffusion 模型

一、说明 作为广泛使用这些工具和模型的人&#xff0c;我的目标是解开 RNN、Transformer 和 Diffusion 模型的复杂性和细微差别&#xff0c;为您提供详细的比较&#xff0c;为您的特定需求提供正确的选择。 无论您是在构建语言翻译系统、生成高保真图像&#xff0c;还是处理时间…