题目:给定一个n  m的网格,其中每个单元格中可能有三种值。分别是0,1,2。

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

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

数据范围:1  n , m  100 , 网络中的值满足0    val   2

 测试用例:

用例1
输入:[[2,1,1],[1,1,0],[0,1,1]]
输出:4用例2
输入:[[2,1,1],[1,0,1],[1,1,1]]
输出:4

题目评价:

本人是最讨厌这种类型的题目,感觉特别麻烦(本人太菜了)。但这种题目的主流解法有两种:广度优先搜索(BFS)和 队列实现

解题思路:

方法一(BFS):

首先分别将腐烂的橘子和新鲜的橘子保存在两个集合中;

模拟广度优先搜索的过程,方法是判断在每个腐烂橘子的四个方向上是否有新鲜橘子,如果有就腐烂它。每腐烂一次时间加 11,并剔除新鲜集合里腐烂的橘子;

当橘子全部腐烂时结束循环。

func orangesRotting(grid [][]int) int {if !hasFresh(grid) {return 0}time := getTimes(grid)if hasFresh(grid) {return -1}return time
}func hasFresh(grid [][]int) bool {for i := range grid {for _, val := range grid[i] {if 1 == val {return true}}}return false
}func getTimes(grid [][]int) int {q := getQueue(grid)time := 0for len(q) > 0 {next := make([][]int, 0)for i := range q {row := q[i][0]col := q[i][1]next = setRot(grid, next, row-1, col)next = setRot(grid, next, row, col+1)next = setRot(grid, next, row+1, col)next = setRot(grid, next, row, col-1)}if len(next) != 0 {time++}q = next}return time
}func getQueue(grid [][]int) [][]int {q := make([][]int, 0)for i := range grid {for j, val := range grid[i] {if 2 == val {q = append(q, []int{i, j})}}}return q
}func setRot(grid, q [][]int, row, col int) [][]int {if row < 0 || col < 0 || row >= len(grid) || col >= len(grid[0]) || grid[row][col] != 1 {return q}grid[row][col] = 2q = append(q, []int{row, col})return q
}

方法二( 队列实现):

// 位置结构体
type Pos struct {r,c int}// 队列
type Queue []Pos// 入队
func (this *Queue)Push(x Pos) {(*this) = append(*this,x)
}// 出队
func (this *Queue)Pop() Pos {res := (*this)[0](*this) = (*this)[1:len(*this)]return res
}// 判断队空
func (this Queue)IsEmpty() bool {if len(this) == 0 {return true}return false
}func orangesRotting(grid [][]int) int {res := -1n,m := len(grid),len(grid[0])dir := [][2]int{{1,0},{-1,0},{0,1},{0,-1}}  // 方向矢量num1,num2 := 0,0    // 记录每一层腐烂橘子的数目flag := false   // 记录初始状态下是否含有新鲜橘子var ql Queuefor i := 0; i < n; i++ {for j := 0; j < m; j++ {if grid[i][j] == 2 {    // 把第一层腐烂橘子入队并计数ql.Push(Pos{i,j})num1++}if grid[i][j] == 1 {flag = true}}}if num1 == 0 {  // 若没有腐烂的橘子结果取决于有无新鲜的橘子if flag {return -1}return 0}for !ql.IsEmpty() {now := ql.Pop()for i := 0; i < 4; i++ {r,c := now.r+dir[i][0],now.c+dir[i][1]if r >= 0 && r < n && c >= 0 && c < m && grid[r][c] == 1 {grid[r][c] = 2ql.Push(Pos{r,c})num2++}}num1--if num1 == 0 {  // 遍历完一层就记一次数res++num1 = num2num2 = 0} }// 判断是否还有新鲜的橘子for i := 0; i < n; i++ {for j := 0; j < m; j++ {if grid[i][j] == 1 {return -1}}}return res
}

如果还是看不懂,可以看这个力扣网站上面的这道题目,相信对你有所帮助力扣https://leetcode.cn/problems/rotting-oranges/

go面试题 腐烂的苹果(橘子、水果)相关推荐

  1. 2014新浪校招笔试题:取水果(17年第一篇让人懵逼的面试题)

    前言 2017 年,我还是会坚持每周一篇面试题,当然我每周看的面试题肯定是不止一篇的,我是在这周看过的面试题中,选择一题自己认为较好的来写.因为每一篇都写,不现实,写一篇博客,需要的时间也是挺长的,所 ...

  2. 2014新浪校招笔试题:取水果

    2019独角兽企业重金招聘Python工程师标准>>> 题目 有任意种水果, 每种水果个数也是任意的, 两人轮流从中取出水果, 规则如下: 1) 每一次应取走至少一个水果; 每一次只 ...

  3. 水果手绘插画素材|一眼就想吃了!

    不同风格的水果插画 在展现水果多面潜力的同时,也不断给大众带来惊喜 丰富的场景刻画出新潮.时尚的设计效果 一眼就想吃了! 奇异果猕猴桃新鲜切片果肉水果插画 牛油果鳄梨彩色手绘果壳水果插画 柠檬切片彩色 ...

  4. [转载] JAVA面向对象之代码块 继承 方法的重写 super关键字与重写toString()方法介绍

    参考链接: 可以重写Java中的私有方法吗 JAVA面向对象之代码块与继承 代码块分类 局部代码块 作用:限制变量生命周期 书写位置:在方法中 构造代码块 开发中很少使用 书写位置:类中  方法外 调 ...

  5. 《 Python List 列表全实例详解系列(八)》__随机列表元素

    < Python List 列表全实例详解系列(八)> __随机列表元素 本章目录: 十.随机列表元素 方法1:random.shuffle 方法2:random.sample 十.随机列 ...

  6. 《数据库应用系统实践》------ 超市管理系统

    系列文章 <数据库应用系统实践>------ 超市管理系统 文章目录 系列文章 一.需求分析 1.系统背景 2. 系统功能结构(需包含功能结构框图和模块说明) 3.系统功能简介 二.概念模 ...

  7. 【SQL怎么写】查询同一张表中同一个ID对应最新时间的数据记录

    需求 同一张表中,怎么查询出同一个ID的最新记录,比如,某一个用户做过很多次修改,我只以最后一次提交记录为准,这时候是不是犯难了 1.数据准备 SET NAMES utf8mb4; SET FOREI ...

  8. Python继承、方法重写

    继承 在编写类时,并不是每次都要从空白开始.当要编写的类和另一个已经存在的类之间存在一定的继承关系时,就可以通过继承来达到代码重用的目的,提高开发效率. class one():"" ...

  9. 设计模式——创建型设计模式

    创建型设计模式 争对对象/类创建时的优化 工厂方法模式(了解) 通过定义顶层抽象工厂类,通过继承的方式,针对于每一个产品都提供一个工厂类用于创建. 情况:只适用于简单对象,当我们需要生产许多个产品族的 ...

最新文章

  1. 【124】排球基本技术
  2. matlab the installer cannot read,MATLAB安装 The installer cannot read the mwinstall.dll… | 学步园...
  3. java中的Attribute类_java培训技术ModelAttribute注解修饰POJO类型的入参
  4. pandas 空字符串与na区别_关于python:Pandas用空白/空字符串替换NaN
  5. 跨平台Unicode编程的一点问题
  6. Exchange系列之exchange2003sp2部署
  7. 抖音封禁超万账号;小米回应手机壳含毒;百度网盘封杀非官方版 | CSDN极客头条
  8. Tapestry5之多个方法匹配
  9. 关于Encode in UTF-8 without BOM
  10. 【xpghost】揭晓Windows 7快捷键的秘密
  11. JDK 8 函数式编程入门
  12. 计算机毕业论文个人小结2500字,毕业论文个人小结
  13. 巧用RoaringBitMap处理海量数据内存diff问题
  14. tp路由服务器无响应,路由器无法PPPOE链接上网老显示服务器无响应
  15. SQL语句oracle中如何插入Date类型的数据
  16. ios开发之autolayout 第三方框架Masonry
  17. 什么是分布式系统!以及分布式系统架构的优缺点
  18. 我是疫情期间的幸运儿
  19. 细细探究MySQL Group Replicaiton — 配置维护故障处理全集
  20. 元宇宙,真的是人类的“死路”吗?

热门文章

  1. php占用服务器内存,php-fpm占用cpu和内存过高100% 解决办法
  2. 神器!五分钟完成大型爬虫项目!
  3. 应用多线程抓取小米应用商店的例子
  4. MPC控制学习笔记——输入权重对系统控制的影响
  5. ios runtime详解
  6. 网络规划设计师难考吗?
  7. linux nice 命令详解
  8. linux nice 命令
  9. 2856. 仰望星空
  10. 年度总结(依然仰望星空,知世俗不世俗)