首页 > 试题广场 >

腐烂的苹果

[编程题]腐烂的苹果
  • 热度指数:2866 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个 的网格,其中每个单元格中可能有三种值中的一个 0 , 1 , 2。
其中 0 表示这个格子为空、1 表示这个格子有一个完好的苹果,2 表示这个格子有一个腐烂的苹果。
腐烂的苹果每分钟会向上下左右四个方向的苹果传播一次病菌,并导致相邻的苹果腐烂。请问经过多少分钟,网格中不存在完好的苹果。如果有苹果永远不会腐烂则返回 -1。
数据范围: ,网格中的值满足
示例1

输入

[[2,1,1],[1,0,1],[1,1,1]]

输出

4
示例2

输入

[[2,1,0],[1,0,1],[0,0,0]]

输出

-1
package main

import "strconv"

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param grid int整型二维数组 
 * @return int整型
*/
func rotApple( grid [][]int ) int {
    n,m:=len(grid),len(grid[0])
    vis:=map[string]bool{}
    q:=[][]int{}
    for i:=0;i<n;i++{
        for j:=0;j<m;j++{
            if grid[i][j]==2{
                q=append(q,[]int{i,j})
            }
            if grid[i][j]==1{
                k:=strconv.Itoa(i)+"-"+strconv.Itoa(j)
                vis[k]=true
            }
        }
    }
    dirs:=[][]int{[]int{1,0},[]int{-1,0},[]int{0,1},[]int{0,-1}}
    cnt:=0
    for len(q)>0{
        new_q:=[][]int{}
        for _,qi:=range q{
            for _,dir:=range dirs{
                x,y:=qi[0]+dir[0],qi[1]+dir[1]
                if x>=0&&x<n&&y>=0&&y<m&&grid[x][y]==1{
                    grid[x][y]=2
                    k:=strconv.Itoa(x)+"-"+strconv.Itoa(y)
                    delete(vis,k)
                    new_q=append(new_q,[]int{x,y})
                }
            }
        }
        if len(new_q)>0{
            cnt++
        }
        q=new_q
    }
    if len(vis)>0{
        return -1
    }
    return cnt
}

发表于 2023-03-16 00:06:26 回复(0)