面试题6 -- 腐烂的苹果(多源DFS)

腐烂的苹果(多源DFS)

文章目录

  • 腐烂的苹果(多源DFS)
    • 解题思路
    • 代码拟写及相关注意点
    • 总结

题目链接: 腐烂的苹果_多源DFS

描述

给定一个 n×m 的网格,其中每个单元格中可能有三种值中的一个 0 , 1 , 2。

其中 0 表示这个格子为空、1 表示这个格子有一个完好的苹果,2 表示这个格子有一个腐烂的苹果。

腐烂的苹果每分钟会向上下左右四个方向的苹果传播一次病菌,并导致相邻的苹果腐烂。请问经过多少分钟,网格中不存在完好的苹果。如果有苹果永远不会腐烂则返回 -1

数据范围

1≤n,m≤1000 ,网格中的值满足 0≤val≤2

解题思路

这个问题可以通过广度优先搜索(BFS)来解决,因为我们需要以最短的时间传播腐烂的苹果。我们可以将每个腐烂的苹果看作是一个源点,然后从这些源点同时开始传播。

  1. 初始化队列:首先,我们将所有初始状态为腐烂的苹果的位置加入到一个队列中,因为它们是传播腐烂的源头。
  2. 广度优先搜索:然后,我们进行广度优先搜索。对于队列中的每个苹果,我们检查它的四个邻居(上、下、左、右)。如果邻居是一个完好的苹果(值为1),我们就将它变为腐烂的苹果,并将其位置加入队列中,以便在下一分钟继续传播。(注意避免一个位置被重复加入队列)
  3. **记录时间:**我们需要记录传播的层数,即分钟数。每次从队列中取出元素时,层数加1。
  4. **检查完好的苹果:**当队列为空时,我们检查网格中是否还有完好的苹果。如果有,说明它们永远不会腐烂,我们返回-1。否则,我们返回传播所需的分钟数。

代码拟写及相关注意点

注意点:

  • 为了便于我们管理整个矩阵中的所有点,由于每个点的横纵坐标唯一性,使用pair对坐标实现统一管理
  • 其次,为了避免判断周围坐标点代码冗余,给出向量数组(分别对应上右下左<顺时针>),通过统一处理就可以只通过遍历向量数组时下标的轮转来得到指定点上下左右的点横纵坐标在这里插入图片描述
  • 同时注意同一点不能重复入队列以及每次取front()都要对应pop()移除对头,否则会导致 内存超限 控制出队列的循环永无止境,从而程序超时判否

示例代码:

class Solution {
public:using pii = pair<int, int>;// 顺时针给出向量数组int x_arr[4] = {0, 1, 0, -1};int y_arr[4] = {1, 0, -1, 0};bool visit[1001][1001] = {false};int rotApple(vector<vector<int> >& grid) {int m = grid.size();int n = grid[0].size();queue<pii> q;// 先把坏苹果移入队列for(int i = 0; i < m; ++i){for(int j = 0; j < n; j++){if(grid[i][j] == 2) { q.push({i, j}); }}}int cnt = 0;    // 记录层数(分钟数)while(!q.empty())   // 遍历所有节点{int size = q.size();cnt++;while(size--)   // 逐层遍历{auto [x, y] = q.front();// 将该层的每个节点最短路展开,符合条件的节点push进队列for(int i = 0; i < 4; i++){int tmp_x = x + x_arr[i];int tmp_y = y + y_arr[i];if(tmp_x >= 0 && tmp_x < m && tmp_y >= 0 && tmp_y < n&& grid[tmp_x][tmp_y] == 1 && !visit[tmp_x][tmp_y]){q.push({tmp_x, tmp_y});visit[tmp_x][tmp_y] = true;}}q.pop();}}// 检查是否有苹果未被感染for(int i = 0; i < m; ++i){for(int j = 0; j < n; j++){if(grid[i][j] == 1 && !visit[i][j]) { return -1; }}}return cnt - 1;}
};

提交截图:

在这里插入图片描述

总结

​ 问题的关键是理解如何使用BFS来模拟腐烂的传播过程。我们需要维护一个队列来存储每一分钟需要传播的苹果位置,并且需要一个二维数组来标记已经访问过的位置,以避免重复处理。通过逐层传播,我们可以确保每个苹果都是以最短的时间腐烂。最后,我们通过检查网格中是否还有完好的苹果来确定所有苹果是否都已腐烂。如果所有苹果都已腐烂,我们返回总的分钟数;如果有苹果永远不会腐烂,我们返回-1。

​ 这个解法的时间复杂度是O(n*m),其中n和m分别是网格的行数和列数。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pycharm远程连接实验室服务器Conda环境配置

如何配置Pycharm和远程服务器 这类博客较多&#xff0c;参考内容 https://blog.csdn.net/fengbao24/article/details/125515542 Python解释器选择&#xff08;conda3&#xff09; 1. Settings -> Add Interpreter -> On SSH 注意&#xff0c;这里的SSH需要在你把远程…

C++感受9-Hello Object 生死版•上

你好对象&#xff01; 认识C中基础中的基础类型&#xff1b;创建用户自定义的复合类型&#xff1b;创建新类型的对象&#xff1b;定制新类型对象的生死过程 零、面向对象启蒙 之前我们一直在问候世界&#xff0c;从这节课开始&#xff0c;我们的问候对象就是“对象&#xff08…

图解《图搜索算法》及代码实现

关注我&#xff0c;持续分享逻辑思维&管理思维&#xff1b; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导&#xff1b; 有意找工作的同学&#xff0c;请参考博主的原创&#xff1a;《面试官心得--面试前应该如何准备》&#xff0c;《面试官心得--面试时如何进行自…

SpringBoot学习之Kafka发送消费消息入门实例(三十五)

使用Kafka之前需要先启动fKafka,如何下载安装启动kafka请先参考本篇文章的前两篇: 《SpringBoot学习之Kafka下载安装和启动【Windows版本】(三十四)》 《SpringBoot学习之Kafka下载安装和启动【Mac版本】(三十三)》 一、POM依赖 1、加入kafka依赖 2、我的整个POM代码…

再谈C语言——理解指针(二)

指针变量类型的意义 指针变量的⼤⼩和类型⽆关&#xff0c;只要是指针变量&#xff0c;在同⼀个平台下&#xff0c;⼤⼩都是⼀样的&#xff0c;为什么还要有各种各样的指针类型呢&#xff1f; 其实指针类型是有特殊意义的&#xff0c;我们接下来继续学习。 指针的解引⽤ 对⽐…

vscode中使用rust的跳转定义时,rust-analyzer报错“未找到定义”,如何解决?

本文是关于错误解决的一个记录&#xff0c;如果你在使用vscode编写rust程序的过程中也遇到同样的错误&#xff0c;不妨一试。 我遇到的错误是&#xff0c;在编写的rust程序中想要跳转到当前变量或者函数的定义处&#xff0c;但按下F12无法跳转&#xff0c;且提示“未找到xxx定…

智能汽车:自动驾驶浅谈(入门)

1、 自动驾驶——数据驱动下的算法迭代 1.1、 自动驾驶算法是感知、预测、规划、控制的结合体 自动驾驶算法反应了工程师们根据人的思维模式&#xff0c;对自动驾驶所需处理过程的思考。通常包含感知、预测、规划模块&#xff0c;同时辅助一些地图、定位等模块&#xff0c;实…

【大模型系列】指令微调

概述 指令微调&#xff08;Instruction Tuning&#xff09;是指使用自然语言形式的数据对预训练后的大语言模型进行参数微调&#xff0c;22年谷歌ICLR论文中提出这个概念。在其它文献中&#xff0c;指令微调也被称为有监督微调&#xff08;Supervised Fine-tuning&#xff09;…

Python进阶编程 --- 3.闭包、装饰器、设计模式、多线程、网络编程、正则表达式、递归

文章目录 第三章&#xff1a;3.1 闭包3.2 装饰器语法糖写法 3.3 设计模式3.3.1 单例模式3.3.2 工厂模式 3.4 多线程3.4.1 进程、线程和并行执行3.4.2 多线程编程 3.5 网络编程3.5.1 Socket3.5.2 服务端开发3.5.3 客户端开发 3.6 正则表达式3.6.1 基础匹配3.6.2 元字符匹配单字符…

QT客户端开发的技术难点

QT是一种功能强大且灵活的跨平台应用程序开发框架&#xff0c;但也存在一些技术难点&#xff0c;需要开发者仔细考虑和克服。以下是一些常见的QT开发技术难点。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 跨平台兼容性 QT框架…

Kafka学习笔记(二、linux和docker安装及使用demo)

1.安装启动 1.1.下载解压 官网下载地址将下载的tar包上传到服务器一个目录&#xff0c;然后解压$ tar -xzf kafka_2.13-3.7.0.tgz $ cd kafka_2.13-3.7.01.2. 启动环境 需安装Jdk8&#xff0c;Kafka可以使用ZooKeeper或KRaft启动。 ZooKeeper启动 运行如下命令&#xff0c;…

FebHost:科技企业如何规划并注册.AI域名?

为确保企业使用.AI域名的方式准确反映其对人工智能技术的关注&#xff0c;企业应考虑以下步骤&#xff1a; 了解法律和合规要求&#xff1a; 第一步是了解与 .AI 域名相关的独特法律和合规要求。由于.AI域名源于安圭拉&#xff0c;企业必须遵守安圭拉的限制和法律规定。这包括…