BFS解决多源最短路相关leetcode算法题

文章目录

  • 1.01矩阵
  • 2.飞地的数量
  • 3.地图中的最高点
  • 4.地图分析

1.01矩阵

01矩阵
)

class Solution {
    int dx[4] = {0,0,1,-1};
    int dy[4] = {1,-1,0,0};
public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {
        //正难则反,找0到1的最短距离
        int m = mat.size(),n = mat[0].size();
        queue<pair<int,int>> q;
        //通过此数组对应位置的值既可以标识某个位置是否已访问过,也可在此基础上往外扩展
        vector<vector<int>> dist(m,vector<int>(n,-1));
        //if(dist[][] == -1) 表示此位置没被访问过
        //if(dist[][] != -1) 表示此位置被访问过
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(mat[i][j] == 0)
                {
                    dist[i][j] = 0;
                    q.push({i,j});
                }
            }
        }
        while(q.size())
        {
            auto [a,b] = q.front();q.pop();
            for(int i=0;i<4;i++)
            {
                int x = a+dx[i], y =b+dy[i];
                if(x>=0 && x<m && y>=0 && y<n && mat[x][y]&& dist[x][y]==-1)
                {
                    dist[x][y] = dist[a][b]+1;
                    q.push({x,y});
                }
            }
        }
        return dist;
    }
};

2.飞地的数量

飞地的数量
在这里插入图片描述

class Solution {
    int dx[4] = {0,0,1,-1};
    int dy[4] = {1,-1,0,0};
public:
    int numEnclaves(vector<vector<int>>& grid) {
        int m = grid.size(),n = grid[0].size();
        vector<vector<bool>> vis(m,vector<bool>(n));
        queue<pair<int,int>> q;
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(i==0||i==m-1||j==0||j==n-1)
                {
                    if(grid[i][j] == 1)
                    {
                        q.push({i,j});
                        vis[i][j] = true;
                    }
                }
            }
        }
        //多源BFS
        while(q.size())
        {
            auto [a,b] = q.front();
            q.pop();
            for(int k=0;k<4;k++)
            {
                int x = a+dx[k],y = b+dy[k];
                if(x>=0&&x<m&&y>=0&&y<n&&grid[x][y]==1&& !vis[x][y])
                {
                    q.push({x,y});
                    vis[x][y] = true;
                }
            }
        }
        //遍历统计
        int ret = 0;
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(grid[i][j]==1 && !vis[i][j]) ret++;
            }
        }

        return ret;
    }
};

3.地图中的最高点

地图中的最高点
在这里插入图片描述

class Solution {
    int dx[4] = {0,0,1,-1};
    int dy[4] = {1,-1,0,0};
public:
    vector<vector<int>> highestPeak(vector<vector<int>>& isWater) {
        int m = isWater.size(), n=isWater[0].size();
        queue<pair<int,int>> q;
        vector<vector<int>> dist(m,vector<int>(n,-1));
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(isWater[i][j])
                {
                    q.push({i,j});
                    dist[i][j]=0;
                }
            }
        }
        //多源BFS
        while(q.size())
        {
            auto [a,b] = q.front();q.pop();
            for(int k=0;k<4;k++)
            {
                int x = a+dx[k],y=b+dy[k];
                if(x>=0&&x<m&&y>=0&&y<n&&dist[x][y] == -1)
                {
                    dist[x][y] = dist[a][b]+1;
                    q.push({x,y});
                }
            }
        }
        return dist;
    }
};

4.地图分析

地图分析
在这里插入图片描述

class Solution {
    int dx[4] = {0,0,1,-1};
    int dy[4] = {1,-1,0,0};
public:
    int maxDistance(vector<vector<int>>& grid) {
        //正难则反
        int m=grid.size(),n=grid[0].size();
        vector<vector<int>> dist(m,vector<int>(n,-1));
        queue<pair<int,int>> q;
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(grid[i][j])
                {
                    dist[i][j] =0;
                    q.push({i,j});
                }
            }
        }
        //多源BFS
        int ret = -1;
        while(q.size())
        {
            auto[a,b] = q.front();q.pop();
            for(int k=0;k<4;k++)
            {
                int x = a+dx[k],y=b+dy[k];
                if(x>=0&& x<m && y>=0 && y<n && dist[x][y] == -1)
                {
                    dist[x][y] = dist[a][b]+1;
                    q.push({x,y});
                    ret = max(ret,dist[x][y]);
                }
            }
        }
        return ret;
    }
};

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

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

相关文章

Apache Commons JCS缓存解决方案

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff01;今天&#xff0c;咱们来聊聊Apache Commons JCS&#xff0c;一个Java界里的缓存大杀器。缓存技术&#xff0c;对于提高应用性能来说&#xff0c;就像是给它加了一剂兴奋剂&#xff0c;能让数据访问变得快如闪电。…

Go 泛型之泛型约束

Go 泛型之泛型约束 文章目录 Go 泛型之泛型约束一、引入二、最宽松的约束&#xff1a;any三、支持比较操作的内置约束&#xff1a;comparable四、自定义约束五、类型集合&#xff08;type set&#xff09;六、简化版的约束形式七、约束的类型推断八、小结 一、引入 虽然泛型是…

uniCloud 创建项目

1. 新建项目 2. 新建云服务空间 若提示需登录&#xff0c;则登录 若提示需实名认证&#xff0c;则完成实名认证 3. 关联云服务空间 关联成功后

MySQL进阶之(一)逻辑架构

一、逻辑架构 1.1 逻辑架构剖析1.1.1 连接层1.1.2 服务层01、基础服务组件02、SQL Interface&#xff1a;SQL 接口03、Parser&#xff1a;解析器04、Optimizer&#xff1a;查询优化器05、Caches & Buffers&#xff1a; 查询缓存组件 1.1.3 引擎层1.1.4 存储层1.1.5 总结 1.…

UG NX二次开发(C++)-通过两点和高度创建长方体

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、采用UFun函数来创建长方体3、采用NXOpen方法实现两点和高度创建长方体4、验证1、前言 在UG NX二次开发时,我们通常会采用ufun函数来完成功能的开发,但是有些功能在ufun函数中不能找到…

[Redis实战]优惠券秒杀

三、优惠券秒杀 3.1 全局唯一ID 每个店铺都可以发布优惠券&#xff1a; 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这种表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题&#xff1a; id的规律性太明显受单表数据量的限制 场景分析一&…

软件测试题常见版

1、python深浅拷贝 浅拷贝&#xff0c;指的是重新分配一块内存&#xff0c;创建一个新的对象&#xff0c;但里面的元素是原对象中各个子对象的引用。深拷贝&#xff0c;是指重新分配一块内存&#xff0c;创建一个新的对象&#xff0c;并且将原对象中的元素&#xff0c;以递归的…

TPRI-DMP平台介绍

TPRI-DMP平台介绍 TPRI-DMP平台概述 TPRI-DMP为华能集团西安热工院自主产权的工业云PaaS平台&#xff0c;已经过13年的发展和迭代&#xff0c;其具备大规模能源电力行业生产应用软件开发和运行能力。提供TPRI-DMP平台主数据管理、业务系统开发与运行、应用资源管理与运维监控…

python抽象基类之_subclasshook_方法

Python的鸭子特性&#xff08;duck typing&#xff09; Python中自定义的类只要实现了某种特殊的协议&#xff0c;就能赋予那种行为&#xff0c;举一个简单的例子&#xff1a; class A:def __len__(self):return 0 a A() print(len(a)) 如上所示&#xff0c;自己定义了一个类…

模型系列:增益模型Uplift Modeling原理和案例

模型系列&#xff1a;增益模型Uplift Modeling原理和案例 目录 1. 简介1. 第一步2. 指标3. 元学习器 3.1 S-学习器3.2 T-学习器3.3 T-学习器相关模型 简介 Uplift是一种用于用户级别的治疗增量效应估计的预测建模技术。每家公司都希望增加自己的利润&#xff0c;而其中一个…

C++11的lambda表达式

Lambda表达式是一种匿名函数&#xff0c;允许我们在不声明方法的情况下&#xff0c;直接定义函数。它是函数式编程的一种重要特性&#xff0c;常用于简化代码、优化程序结构和增强代码可读性。 lambda表达式的语法非常简单&#xff0c;具体定义如下&#xff1a; [ captures ]…

React学习计划-React16--React基础(七)redux使用与介绍

笔记gitee地址 一、redux是什么 redux是一个专门用于做状态管理的js库&#xff08;不是react插件库&#xff09;它可以用在react、angular、vue的项目中&#xff0c;但基本与react配合使用作用&#xff1a;集中式管理react应用中多个组件共享的状态 二、什么情况下需要使用r…

antv/x6_2.0学习使用(三、内置节点和自定义节点)

内置节点和自定义节点 一、节点渲染方式 X6 是基于 SVG 的渲染引擎&#xff0c;可以使用不同的 SVG 元素渲染节点和边&#xff0c;非常适合节点内容比较简单的场景。面对复杂的节点&#xff0c; SVG 中有一个特殊的 foreignObject 元素&#xff0c;在该元素中可以内嵌任何 XH…

数据结构与算法笔记

数据结构&#xff1a; 就是指一组数据的存储结构 算法&#xff1a; 就是操作数据的一组方法 数据结构和算法 两者关系 数据结构和算法是相辅相成的。数据结构是为算法服务的&#xff0c;算法要作用在特定的数据结构之上。 数据结构是静态的&#xff0c;它只是组织数据的一…

Windows窗口程序详解

今天来给大家详细剖析一下Windows的消息机制 一、什么是消息机制 首先消息机制是Windows上面进程之间通信的一种方式&#xff0c;除此之外还包括共享内存&#xff0c;管道&#xff0c;socket等等进程之间的通信方式&#xff0c;当然socket还可以实现远程进程之间的通信&#…

JS变量和函数提升

JS变量和函数提升 JS变量提升编译阶段执行阶段相同变量或函数 变量提升带来的问题变量容易不被察觉的遭覆盖本应销毁的变量未被销毁 如何解决变量提升带来的问题 JS变量提升 sayHi()console.log(myname)var myname yyfunction sayHi() {console.log(Hi) }// 执行结果: // Hi …

我的2023年,平淡中寻找乐趣

文章目录 两个满意我学会了自由泳。学习英语 一个较满意写博客 2024的期望 2023年&#xff0c;我有两个满意&#xff0c;一个较满意。 两个满意 我学会了自由泳。 开始练习自由泳是从2023年3月份&#xff0c;我并没有请教练&#xff0c;而是自己摸索。在抖音上看自由泳的视频…

【一分钟】ThinkPHP v6.0 (poc-yaml-thinkphp-v6-file-write)环境复现及poc解析

写在前面 一分钟表示是非常短的文章&#xff0c;只会做简单的描述。旨在用较短的时间获取有用的信息 环境下载 官方环境下载器&#xff1a;https://getcomposer.org/Composer-Setup.exe 下载文档时可以设置代理&#xff0c;不然下载不上&#xff0c;你懂的 下载成功 cmd cd…

JavaWeb——前端之HTMLCSS

学习视频链接&#xff1a;https://www.bilibili.com/video/BV1m84y1w7Tb/?spm_id_from333.999.0.0 一、Web开发 1. 概述 能通过浏览器访问的网站 2. Web网站的开发模式——主流是前后端分离 二、前端Web开发 1. 初识 前端编写的代码通过浏览器进行解析和渲染得到我们看到…

Java多线程常见的成员方法(线程优先级,守护线程,礼让/插入线程)

目录 1.多线程常见的成员方法2.优先级相关的方法3.守护线程&#xff08;备胎线程&#xff09;4.其他线程 1.多线程常见的成员方法 ①如果没有给线程设置名字&#xff0c;线程是有默认名字 的&#xff1a;Thread-X(X序号&#xff0c;从0开始) ②如果要给线程设置名字&#xff0c…