代码随想录算法训练营第四十二天|广度优先搜索理论基础、岛屿数量:深搜版、岛屿数量:广搜版

news2025/1/12 20:39:07

广度优先搜索理论基础

广搜(bfs)是一圈一圈的搜索过程。因为广搜是从起点出发,以起始点为中心一圈一圈进行搜索,一旦遇到终点,记录之前走过的节点就是一条最短路。

广搜的过程:我们从图中可以看出,从start起点开始,是一圈一圈,向外搜索,方格编号1为第一步遍历的节点,方格编号2为第二步遍历的节点,第四步的时候我们找到终止点end。

正是因为BFS一圈一圈的遍历方式,所以一旦遇到终止点,那么一定是一条最短路径。

代码框架:

其实,我们仅仅需要一个容器,能保存我们要遍历过的元素就可以,那么用队列,还是用栈,甚至用数组,都是可以的

用队列的话,就是保证每一圈都是一个方向去转,例如统一顺时针或者逆时针

因为队列是先进先出,加入元素和弹出元素的顺序是没有改变的。

#include <bits/stdc++.h>
using namespace std;

int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};
void bfs(vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y){
    queue<pair<int, int>> que;
    que.push({})//起始节点加入队列
    visited[x][y] = true;
    while(!que.empty()){
        pair<int, int> cur = que.front();
        que.pop();
        int curx = cur.first();
        int cury = cur.second();
        for(int i=0; i<4; i++){
            int nextx = curx + dir[i][0];
            int nexty = cury + dir[i][1];
            if(nextx<0||nextx>=grid.size()||nexty<0||nexty>=grid[0].size()) continue;
            if(!visited[nextx][nexty]){ // 如果节点没被访问过
                que.push({nextx, nexty}); // 队列添加该节点为下一轮要遍历的节点
                visited[nextx][nexty] = true; // 只要加入队列立刻标记,避免重复访问
            }
        }
    }

}

99. 岛屿数量:深搜版

#include <bits/stdc++.h>
using namespace std;

//N和M表示矩阵的行数和列数
int dir[4][2] = {0,1,1,0,-1,0,0,-1};
void dfs(const vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y){
    for(int i=0; i<4; i++){
        int nextx = x + dir[i][0];
        int nexty = y + dir[i][1];
        if(nextx<0||nextx>=grid.size()||nexty<0||nexty>=grid[0].size()) continue;
        if(!visited[nextx][nexty] && grid[nextx][nexty] == 1){
            visited[nextx][nexty] = true;
            dfs(grid, visited, nextx, nexty);
        }
    }
}

int main(){
    int n, m;
    cin>>n>>m;
    vector<vector<int>> grid(n, vector<int>(m, 0));
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            cin>>grid[i][j];
        }
    }
    vector<vector<bool>> visited(n, vector<bool>(m, false));
    int result = 0;
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            if(!visited[i][j]&&grid[i][j]==1){
                visited[i][j] = true;
                result++;
                dfs(grid, visited, i, j);
            }
        }
    }
    cout<<result<<endl;
}

99. 岛屿数量:广搜版

只要 加入队列就代表 走过,就需要标记,而不是从队列拿出来的时候再去标记走过

如果从队列拿出节点,再去标记这个节点走过,就会发生下图所示的结果,会导致很多节点重复加入队列。

#include <bits/stdc++.h>
using namespace std;

int dir[4][2] = {0,1,1,0,-1,0,0,-1};
void bfs(const vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y){
    queue<pair<int, int>> que;
    que.push({x, y});
    visited[x][y] = true;
    while(!que.empty()){
        pair<int, int> cur = que.front();
        que.pop();
        int curx = cur.first;
        int cury = cur.second;
        for(int i=0; i<4; i++){
            int nextx = curx + dir[i][0];
            int nexty = cury + dir[i][1];
            if(nextx<0||nextx>=grid.size()||nexty<0||nexty>=grid[0].size()) continue;
            if(!visited[nextx][nexty] && grid[nextx][nexty]==1){
                que.push({nextx, nexty});
                visited[nextx][nexty] = true;//只要访问就要标记
            }
        }
    }
}
int main(){
    int n, m;
    cin>>n>>m;
    vector<vector<int>> grid(n, vector<int>(m, 0));
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            cin>>grid[i][j];
        }
    }
    vector<vector<bool>> visited(n, vector<bool>(m, false));
    int result = 0;
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            if(!visited[i][j] && grid[i][j]==1){
                result++;
                bfs(grid, visited, i, j);
            }
        }
    }
    cout<<result<<endl;
}

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

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

相关文章

HTML+CSS进阶用法(上)——平面转换、渐变、空间转换

欢迎来到CSS变换的世界&#xff0c;这里充满了创意和可能性。在本篇博客中&#xff0c;我们将一起学习如何使用transform属性来实现各种平面和空间转换效果&#xff0c;包括位移、旋转、缩放&#xff0c;以及如何通过渐变和动画来增强我们的网页设计。无论你是初学者还是有经验…

【区块链+金融服务】基于区块链的区域股权金融综合服务平台 | FISCO BCOS应用案例

区域性股权市场是我国资本市场的重要组成部分&#xff0c;是多层次资本市场体系的基石。区块链技术与区域性股权市场 分散特征天然匹配&#xff0c;从新型金融基础设施层面为场外参与各方提供公共的可信服务&#xff0c;以技术手段完善市场基础条 件&#xff0c;弥补区域性短板…

仿RabbiteMq实现简易消息队列正式篇(需求分析)

TOC 目录 MQ的实现方法 RabbitMq中的相关概念 消息队列系统模块划分 总体划分 服务端模块 数据管理模块 虚拟机数据管理模块 交换机路由模块 消费者管理模块 信道&#xff08;通信&#xff09;管理模块 连接管理模块 服务端BrokerServer模块 客户端模块 消费者管…

iPhone 16 机模视频曝光,五种颜色各有千秋

科技博主的最新视频分享了苹果 iPhone 16 标准版的机模上手体验。 视频中展示了五种颜色的 iPhone 16&#xff1a;深邃的蓝色、柔和的粉色、纯净的白色、经典的黑色和生机勃勃的绿色。 与 iPhone 15 相比&#xff0c;iPhone 16 弃用了黄色&#xff0c;新增了白色&#xff0c;…

等保测评中的供应链安全管理:构建安全的数字生态

在数字化转型的浪潮中&#xff0c;供应链已成为企业运营的核心环节&#xff0c;同时也是信息安全的潜在脆弱点。等保测评&#xff0c;作为我国信息安全等级保护制度的重要组成部分&#xff0c;对供应链安全管理提出了明确的要求&#xff0c;旨在构建一个安全、可靠的数字生态。…

Vue 3+Vite+Eectron从入门到实战系列之(六)一工作台界面开发及实现响应式

工作台&#xff0c;是每个后台系统必备的&#xff0c;也是管理系统的首页。这次我们来实现一个工作台&#xff0c;并适配他的响应性 实现效果 代码实现 <template><div class"dashboard"><el-row :gutter"20"><el-col class"mb…

小程序学习day06-wx:for续、WXSS模版样式、rpx尺寸单位、@import、全局样式与局部样式、全局配置

25、wx&#xff1a;for续 &#xff08;5&#xff09;手动指定索引和当前项的变量名 1&#xff09;使用wx:for-index可以指定当前循环项的索引变量名 2&#xff09;使用wx:for-item可以指定当前项的变量名 &#xff08;6&#xff09;wx:key的使用 类似于Vue列表渲染中的:key&a…

2025考研西安电子科技大学马克思主义理论经验贴

学长从西安电子科技大学马克思主义理论专业毕业&#xff0c;现从事高校思政课工作&#xff0c;拥有三年西安电子科技大学马理论考研辅导经验&#xff0c;现写出2025西安电子科技大学马克思主义理论经验贴供大家参考。 一、选学校 选学校首先考虑的是就业&#xff0c;因为咱们…

【书生大模型实战营(暑假场)】基础任务四 InternLM+LlamaIndex RAG 实践

基础任务四 InternLMLlamaIndex RAG 实践 任务文档视频Retrieval-Augmented Generation for Large Language Models: A Survey 文章目录 基础任务四 InternLMLlamaIndex RAG 实践1 理解RAG&#xff0c;使用 RAG1.1 RAG技术概览1.2 RAG工作原理1.3 向量数据库 Vector-DB1.4 RAG…

多态(二)

1. final &#xff1a;修饰虚函数&#xff0c;表示该虚函数不能再被重写 class Car { public:virtual void Drive() final {} }; class Benz :public Car { public:virtual void Drive() {cout << "Benz-舒适" << endl;} }; 2. override: 检查派生类…

如何选取网络中间的输出?并极简方法可视化

文章目录 一、提供几种方法1. 直接修改模型的 forward 方法&#xff1a;2. 使用 hook 函数&#xff1a;3. 直接访问模型的子模块&#xff1a;4. 使用 nn.Sequential 来提取中间层&#xff1a; 2. 如何选择方法3. 实际操作——提取特征并可视化1. 可视化2. 提取特征 一、提供几种…

无人机之电池注意事项

1、外场作业时&#xff0c;电池一定要放置在阴凉处&#xff0c;避免太阳直射&#xff1b; 2、刚作业完的电池发热严重时&#xff0c;请降至室温再充电&#xff1b; 3、注意电池状态&#xff0c;一旦发现电池出现鼓包、漏液等现象&#xff0c;必须马上停止使用&#xff1b; 4…

基于springboot的医院资源管理系统

TOC springboot158基于springboot的医院资源管理系统 第1章 绪论** 1.1 课题背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供…

Redmi 13C 5G 红米13R 5G 解锁BL 降级 MIUI 秒解锁BL 澎湃OS 降级

机型名称 &#xff1a;Redmi 13C 5G/ Redmi 13R 5G/ POCO M6 5G 机型代号 &#xff1a;air HyperOS 降级MIUI 14 澎湃OS 或者miui都可以秒解锁BL&#xff0c; Redmi 13C 5G 红米13R 5G 解锁BL 降级 MIUI 秒解锁BL 澎湃OS 降级,手机ROM - Powered by Discuz!点击上方 下载对…

大迈u盘文件不见了怎么办?全面解析与恢复策略

在数字化时代&#xff0c;U盘作为我们日常工作、学习和生活中不可或缺的存储设备&#xff0c;承载着大量的重要文件。然而&#xff0c;面对突如其来的U盘文件丢失问题&#xff0c;许多用户往往会感到手足无措&#xff0c;甚至因此遭受不可估量的损失。本文将围绕“大迈U盘文件丢…

算法与数据结构笔记

算法是什么 算法定义 算法&#xff08;algorithm&#xff09;是在有限时间内解决特定问题的一组指令或操作步骤&#xff0c;它具有以下特性。 ‧ 问题是明确的&#xff0c;包含清晰的输入和输出定义。 ‧ 具有可行性&#xff0c;能够在有限步骤、时间和内存空间下完成。 ‧…

多种方案解决IOS下uni.share分享分包页面报错Error: Framework inner error

项目场景&#xff1a; 有个需求是用uni.share从app分享微信小程序&#xff0c;发现在苹果手机真机调试的时候 跳转的目标页面会白屏、页面样式错乱、一些组件不出现等问题。并且报错 Error: Framework inner error 问题描述 uniapp开发在苹果手机下app分享微信小程序会出现白…

Golang | Leetcode Golang题解之第336题回文对

题目&#xff1a; 题解&#xff1a; // 哈希表实现 class Solution {public List<List<Integer>> palindromePairs(String[] words) {List<List<Integer>> res new ArrayList<>();int n words.length;Map<String, Integer> indices ne…

Nvidia显卡在深度学习应用中一些概念解释

之前一直在搞深度学习&#xff0c;最近又想着安装一下mamba试一下效果&#xff0c;可以配置环境就花了好长时间&#xff0c;主要还是一些概念没有弄明白&#xff0c;这里记录一下&#xff0c;方便以后查阅。 Nvidia显卡在深度学习应用中一些概念解释 显卡中一些名词的解释CUDA …

ZooKeeper集群环境部署

1. ZooKeeper安装部署 1.1 系统要求 1.1.1 支持的平台 ZooKeeper 由多个组件组成。一些组件得到广泛支持&#xff0c;而另一些组件仅在较小的一组平台上得到支持。 客户端是 Java 客户端库&#xff0c;由应用程序用于连接到 ZooKeeper 集群。 服务器是在 ZooKeeper 集群节点…