代码随想录-广度优先搜索理论基础及相关习题

广度优先搜索理论基础

广搜的搜索方式就适合于解决两个点之间的最短路径问题。因为广搜是从起点出发,以起始点为中心一圈一圈进行搜索,一旦遇到终点,记录之前走过的节点就是一条最短路。
广搜是一圈一圈的遍历方式,如下图:
在这里插入图片描述
遍历可以是用队列,还是用栈,甚至用数组实现。以下是使用队列实现的模板:

//方向数组
 //上(0,1)
 //右(1,0)
 //左(-1,0)
 //下(0,-1)
public int dir[][]={{0,1},{1,0},{-1,0},{0,-1}};
//用于记录是否走过
public boolean[][] visited;
public void bfs(char[][] grid,int x,int y){
        //使用栈实现节点遍历
        Queue<int[]> queue = new LinkedList<>();
        queue.offer(new int[]{x,y});
        visited[x][y]=true;
        while(!queue.isEmpty()){
            int [] node=queue.poll();
            //像四个方向移动
            int nodex=node[0];
            int nodey=node[1];
            for(int i=0;i<4;i++){
                int nextx=nodex+dir[i][0];
                int nexty=nodey+dir[i][1];
                //边界判断
                if(nextx<0||nextx>=grid.length||nexty<0||nexty>=grid[0].length){
                    continue;
                }
                //入栈并标记
                if(visited[nextx][nexty]==false){
                    queue.offer(new int[]{nextx,nexty});
                    visited[nextx][nexty]=true;
                }
            }
        }
    }

岛屿数量

广搜版

class Solution {
    //上(0,1)
    //右(1,0)
    //左(-1,0)
    //下(0,-1)
    public int dir[][]={{0,1},{1,0},{-1,0},{0,-1}};
    public boolean[][] visited;
    public int numIslands(char[][] grid) {
        //标记是否走过
        visited=new boolean[grid.length][grid[0].length];
        int res=0;
        for(int p=0;p<grid.length;p++){
            for(int q=0;q<grid[0].length;q++){
                if(grid[p][q]=='1'&&!visited[p][q]){
                   oneoflands(grid,p,q);
                   res++; 
                }
            }
        }
        return res;
    }
    public void oneoflands(char[][] grid,int x,int y){
        //使用栈实现节点遍历
        Queue<int[]> queue = new LinkedList<>();
        queue.offer(new int[]{x,y});
        visited[x][y]=true;
        while(!queue.isEmpty()){
            int [] node=queue.poll();
            //像四个方向移动
            int nodex=node[0];
            int nodey=node[1];
            for(int i=0;i<4;i++){
                int nextx=nodex+dir[i][0];
                int nexty=nodey+dir[i][1];
                //边界判断
                if(nextx<0||nextx>=grid.length||nexty<0||nexty>=grid[0].length){
                    continue;
                }
                //入栈
                if(grid[nextx][nexty]=='1'&&visited[nextx][nexty]==false){
                    queue.offer(new int[]{nextx,nexty});
                    visited[nextx][nexty]=true;
                }
            }
        }
    }
}

深搜版

class Solution {
    boolean[][] visited;
    int dir[][] = {
        {0, 1}, //right
        {1, 0}, //down
        {-1, 0}, //up
        {0, -1} //left
    };
    public int numIslands(char[][] grid) {
        int count = 0;
        visited = new boolean[grid.length][grid[0].length];

        for(int i = 0; i < grid.length; i++){
            for(int j = 0; j < grid[0].length; j++){
                if(visited[i][j] == false && grid[i][j] == '1'){
                    count++;
                    dfs(grid, i, j);
                }
            }
        }
        return count;
    }

    private void dfs(char[][]grid, int x, int y){
        if(visited[x][y] == true || grid[x][y] == '0')
            return;
	    
        visited[x][y] = true;
	
        for(int i = 0; i < 4; i++){
            int nextX = x + dir[i][0];
            int nextY = y + dir[i][1];
            if(nextX < 0 || nextY < 0 || nextX >= grid.length || nextY >= grid[0].length)
                continue;
            //当前节点满足条件 使用递归标记当前节点的周围节点
            dfs(grid, nextX, nextY);
        }
    }
}

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

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

相关文章

企业电子期刊怎么做,用这个平台就对啦!

企业期刊虽然只是一个小小的刊物&#xff0c;但对于企业的文化建设有着重要的作用。近年来&#xff0c;越来越多的企业开始使用企业电子期刊来为公司文化建设规划服务&#xff0c;也越来越重视企业期刊的质量和水平。 那怎么制作企业电子期刊呢&#xff1f;有句话说得好&#…

pdf.js不分页渲染(渲染完整内容)

直接上代码 首先引入pdf.js 和 pdf.worker.js // 渲染pdf const pdfUrl test1.pdf, _targetDom pdf-container;pdfjsLib.getDocument(pdfUrl).promise.then(async doc > {let _i 0;for (let item of new Array(doc.numPages).fill()) {await renderOtherPage(doc, _i, _t…

ai 问答时刻

妙啊 这很快 相当棒

【Unity细节】Unity中的Transform.SetParent还有你不知道的细节

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 &#x1f636;‍&#x1f32b;️收录于专栏&#xff1a;unity细节和bug &#x1f636;‍&#x1f32b;️优质专栏 ⭐【…

SRRC认证的必要性:保障电子产品质量安全的重要措施

随着电子产品的普及和应用&#xff0c;对电子产品的质量安全要求也越来越高。为了保障消费者的权益和安全&#xff0c;国家对电子产品进行了严格的监管和管理。其中&#xff0c;SRRC认证是保障电子产品质量安全的重要措施之一。 SRRC认证是指在我国境内生产、销售、使用的无线电…

【Java 进阶篇】Java Filter 执行流程及生命周期详解

引言 在 Java Web 开发中&#xff0c;Filter 是一种强大的组件&#xff0c;它允许我们在请求到达 Servlet 之前或者响应返回给客户端之前执行一些操作。Filter 的应用场景非常广泛&#xff0c;例如日志记录、权限验证、字符编码转换等。本文将深入讨论 Java Filter 的执行流程…

CSS3 多媒体查询、网格布局

一、CSS3多媒体查询&#xff1a; CSS3 多媒体查询继承了CSS2多媒体类型的所有思想&#xff0c;取代了查找设备的类型。CSS3根据设置自适应显示。 多媒体查询语法&#xff1a; media not|only mediatype and (expressions) { CSS 代码...; } not: not是用来排除掉某些特定…

除了鲁大师,你还可以装这些。

无论是专业的电脑维护人员&#xff0c;还是只是一个简单的 DIY 兴趣爱好者&#xff0c;有的时候都会或多或少遇到一些电脑硬件的问题。 这种情况下&#xff0c;如果特地去安装一款专门的检测软件&#xff0c;肯定会非常麻烦。 一般来说&#xff0c;检测电脑硬件&#xff0c;使…

2023年【危险化学品生产单位安全生产管理人员】最新解析及危险化学品生产单位安全生产管理人员理论考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品生产单位安全生产管理人员最新解析考前必练&#xff01;安全生产模拟考试一点通每个月更新危险化学品生产单位安全生产管理人员理论考试题目及答案&#xff01;多做几遍&#xff0c;其实通过危险化学品生产…

Unity Mirror学习(三)ClientRpc特性使用

ClientRpc特性 1&#xff0c;从服务端任意一网络对象发送到客户端 2&#xff0c;修饰方法的&#xff0c;在服务器上调用此方法&#xff0c;它将在所有客户端执行&#xff08;我的理解:服务端广播消息&#xff0c;消息方法&#xff09; 3&#xff0c;此方法不会在本地执行 它和…

基于Amazon EC2和Amazon Systems Manager Session Manager的堡垒机设计和自动化实现

01 背景 在很多企业的实际应用场景中&#xff0c;特别是金融类的客户&#xff0c;大部分的应用都是部署在私有子网中。为了能够让客户的开发人员和运维人员从本地的数据中心中安全的访问云上资源&#xff0c;堡垒机是一个很好的选择。传统堡垒机的核心实现原理是基于 SSH 协议的…

如何在本地运行稳定扩散模型

推荐基于稳定扩散(stable diffusion) AI 模型开发的自动纹理工具&#xff1a; DreamTexture.js自动纹理化开发包 - NSDT 继 DALL-E 2 和 Imagen 之后&#xff0c;新的深度学习模型 Stable Diffusion 标志着文本到图像领域的巨大飞跃。本月早些时候发布的 Stable Diffusion 承诺…

linux 安装配置odbc连接mysql数据库

一、odbc安装 yum -y install unixODBC 安装完成之后 查看配置文件地址&#xff1a; odbcinst -j 查看驱动列表&#xff1a; odbcinst -q -d 二、配置mysql数据源 如果driver不存在&#xff0c;则需要安装 配置完成之后&#xff0c;使用isql -v mysql1即可连接数据库

从单体到微服务:使用Spring Boot构建事件驱动的Java应用程序

Spring Boot是Pivotal团队设计的一种微服务框架&#xff0c; 基于Spring开发&#xff0c;用于简化新Spring应用的初始搭建及开发过程&#xff0c;提升Spring 开发者的体验。它秉持“约定大于配置”的思想&#xff0c;集成了大量开箱即用的第三方库&#xff0c;支持绝大多数开源…

django建站过程(4)创建文档显示页面

django建站过程&#xff08;4&#xff09;创建文档显示页面 创建文档显示页面项目主文件夹schoolapps中的文件urls.py在APP“baseapps”中创建url.py文件编写视图模板继承bootstrap创建head.html创建doclist.html创建docdetail.html 使用 markdown 编辑器安装模块Model 模型的d…

力扣每日一道系列 --- LeetCode 88. 合并两个有序数组

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构探索 ✅LeetCode每日一道 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 文章目录 思路1&#xff1a;暴力求解思路2&#xff1a;原地合并 LeetCode 88. 合并两个有序数组…

基于安卓android微信小程序的校园互助平台

项目介绍 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整…

conda清华源安装cuda12.1的pytorch

使用pytorch官方提供的conda command奇慢无比&#xff0c;根本装不下来&#xff08;科学的情况下也这样&#xff09; 配置一下清华源使用清华源装就好了 清华源&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ 配置方法&#xff1a;conda config --…

自制数据集:点云变化

文章目录 说明代码 说明 在干净的点云数据集中加入噪声时&#xff0c;由于不同点云的尺寸不同&#xff0c;很难控制噪声的幅度。为此&#xff0c;需要将所有点云变换到 [ − 0.5 , 0.5 ] 3 [-0.5,0.5]^3 [−0.5,0.5]3的空间当中。如下图所示是两张示意图&#xff1a; 原始点云…

CSS时间线样式

css实现时间线样式&#xff0c;效果如下图&#xff1a; 一、CSS代码 .timeline {padding-left: 5px} .timeline-item { position: relative;padding-bottom: 20px;} .timeline-axis {position: absolute;left: -5px;top: 0;z-index: 10;width: 20px;height: 20px;line-he…
最新文章