题目:


思路:

每个腐烂的橘子都能将自己上下左右的新鲜橘子传染,像极了现在的肺炎...

如果格子中只有一个腐烂的橘子,那么这便是一个典型的层次遍历,第一个传染多个,称为第二层,第二层传染第三层

但这里会出现初始时便有多个腐烂橘子的情况,其实道理是一样的,将第一层看成多个而不是一个,同样是层次遍历

这里利用双栈来实现层次遍历:

栈A存储第一批腐烂橘子,将第一批腐烂橘子传染的第二批腐烂橘子的位置全部存储至B,后将A清空,随后将B中第二批传染的第三批的位置存储至A,将B清空,直至AB均空

同时记录新鲜橘子的个数num,若最后num>0,说明不能将所有橘子传染,返回-1

代码:

class Solution {
public:
// row: 行, col: 列, res: 结果, num: 新鲜橘子数
int row, col, i, j, res=, num=;
void search(int i, int j, stack<pair<int, int>>& S, vector<vector<int>>& visited,
vector<vector<int>>& grid){
if(i->= && !visited[i-][j] && grid[i-][j]==) {
S.push(make_pair(i-, j));
visited[i-][j]=;
grid[i-][j] = ;
num--;
}
if(j->= && !visited[i][j-] && grid[i][j-]==) {
S.push(make_pair(i, j-));
visited[i][j-]=;
grid[i][j-] = ;
num--;
}
if(i+<row && !visited[i+][j] && grid[i+][j]==) {
S.push(make_pair(i+, j));
visited[i+][j]=;
grid[i+][j] = ;
num--;
}
if(j+<col && !visited[i][j+] && grid[i][j+]==) {
S.push(make_pair(i, j+));
visited[i][j+]=;
grid[i][j+] = ;
num--;
}
}
int orangesRotting(vector<vector<int>>& grid) {
row = grid.size();
col = grid[].size();
vector<vector<int>> visited(row, vector<int>(col, ));
stack<pair<int, int>> A, B;
for(i=; i<row; i++){
for(j=; j<col; j++){
if(grid[i][j]==){
A.push(make_pair(i, j));
visited[i][j]=;
}else if(grid[i][j]==)
num++;  // 记录新鲜橘子的个数
}
}
while(!A.empty() || !B.empty()){
if(A.empty()){
while(!B.empty()){
i=B.top().first;
j=B.top().second;
search(i, j, A, visited, grid);
B.pop();
}
}else{
while(!A.empty()){
i=A.top().first;
j=A.top().second;
search(i, j, B, visited, grid);
A.pop();
}
}
res++;
}
if(num) return -;
return res==?res:res-;
}
};

注:在最后一层时,没有可以传染的新鲜橘子了,但此时某个栈里仍是非空的(最后一层各个位置),所以res会多加一次,在最后减去就好

同时,如果没有橘子或者本身就是腐烂橘子,res值为0,此时不需要减去1

 

[LeetCode] 994. Rotting Oranges 腐烂的橘子的更多相关文章

  1. [leetcode] 994. Rotting Oranges

    题目 You are given an m x n grid where each cell can have one of three values: 0 representing an empty ...

  2. 【Leetcode_easy】994. Rotting Oranges

    problem 994. Rotting Oranges 参考 1. Leetcode_easy_994. Rotting Oranges; 完

  3. 【LeetCode】994. Rotting Oranges 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 BFS 日期 题目地址:https://leetco ...

  4. 【leetcode】994. Rotting Oranges

    题目如下: In a given grid, each cell can have one of three values: the value 0 representing an empty cel ...

  5. Leetcode之广度优先搜索(BFS)专题-994. 腐烂的橘子(Rotting Oranges)

    Leetcode之广度优先搜索(BFS)专题-994. 腐烂的橘子(Rotting Oranges) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ar ...

  6. [Swift]LeetCode994. 腐烂的橘子 | Rotting Oranges

    In a given grid, each cell can have one of three values: the value 0 representing an empty cell; the ...

  7. Leetcode春季打卡第四天:994. 腐烂的橘子

    Leetcode春季打卡第四天:994. 腐烂的橘子 Leetcode春季打卡第四天:994. 腐烂的橘子 思路 思路是采用广度优先搜索,一层一层遍历. 首先先扫描矩阵,将坏橘子放进队列,记录正常橘子 ...

  8. leetcode 994.腐烂的橘子

    题目: 在给定的网格中,每个单元格可以有以下三个值之一: 值 0 代表空单元格: 值 1 代表新鲜橘子: 值 2 代表腐烂的橘子. 每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂 ...

  9. Rotting Oranges - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Rotting Oranges - LeetCode 注意点 解法 解法一:bfs.首先先统计所有新鲜的橘子数目fresh,如果fresh大于0则一直执行 ...

随机推荐

  1. VMware 三种网络配置解释

    https://blog.csdn.net/noob_f/article/details/51099040 ifconfig -a 网卡名称

  2. q检验|新复极差法|LSD|二因素方差分析

    生物统计与实验设计 放大程度q检验:精度较高>新复极差法:各种错误比较平均>LSD 其中,LSD不随M的变化而变化,但是SSR和q-test会随M变化而变化. 第一步代表了方差分析的核心思 ...

  3. bwa index|amb|ann|bwt|pac|sa

    -.gapcloser.fa | > t1.fa bwa index -a bwtsw -p t1 t1.fa >t1.bwa_index.log >& #$ ll #tot ...

  4. VS编译release版本的出现的LNK1104 无法打开文件“libboost_filesystem-vc140-mt-1_58.lib

    最近在用restbed和vs2015做一个项目,debug编译的没问题,但是编译release就有问题,困扰了一天,说下我的出坑过程. 1.我用到了外部的库 restbed ,首先要想正确编译过,你的 ...

  5. python学习笔记(13)常用模块列表总结

    os模块: os.remove() 删除文件 os.unlink() 删除文件 os.rename() 重命名文件 os.listdir() 列出指定目录下所有文件 os.chdir() 改变当前工作 ...

  6. Hexo 下 Markdown 的配置与学习

    本篇 更换 Hexo 下的 Markdown 渲染插件 学习 Markdown 基本语法 ✎更换 Markdown 渲染插件 ✎原因 Hexo 内置的默认渲染插件是 hexo-renderer-mar ...

  7. kafka spark steam 写入elasticsearch的部分问题

    应用版本 elasticsearch 5.5 spark 2.2.0 hadoop 2.7 依赖包版本 docker cp /Users/cclient/.ivy2/cache/org.elastic ...

  8. MySQL之数据存储引擎

    1.什么是存储引擎: 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处 理文本用txt类型,处理表格用excel,处理图片用png等,数据库中的表也应该有不同的 ...

  9. [洛谷P3806] [模板] 点分治1

    洛谷 P3806 传送门 这个点分治都不用减掉子树里的了,直接搞就行了. 注意第63行 if(qu[k]>=buf[j]) 不能不写,也不能写成>. 因为这个WA了半天...... 如果m ...

  10. mysqli存储过程

    <?php$link = mysqli_connect('localhost','root','','chinatupai');  $sql = "call getEmail('000 ...