leetcode 994.腐烂的橘子

题目:

在给定的网格中,每个单元格可以有以下三个值之一:

  • 值 0 代表空单元格;
  • 值 1 代表新鲜橘子;
  • 值 2 代表腐烂的橘子。

每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。

返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1

 

分析:

最近在看广度优先搜素的题目,这个是比较简单基础的题了。

腐烂的橘子会把靠近他的新鲜的橘子腐蚀,那么就是只要从所有坏的橘子的地方一层一层往外遍历就可以了。

代码:

 1 //5ms 97%
 2 class Solution {
 3     public int orangesRotting(int[][] grid) {
 4         Queue<int[]> q=new LinkedList<>();
 5         int h=grid.length,w=grid[0].length,time=0;
 6         for(int n=0;n<h;++n)
 7             for(int m=0;m<w;++m)
 8                 if(grid[n][m]==2) {
 9                     int[] po= {0,n,m};
10                     q.add(po);
11                 }
12         while(!q.isEmpty()) {
13             int[] g=q.poll();
14             time=time>g[0]?time:g[0];
15             if(g[1]+1<h&&grid[g[1]+1][g[2]]==1) {
16                 grid[g[1]+1][g[2]]=2;
17                 int[] po= {g[0]+1,g[1]+1,g[2]};
18                 q.add(po);            
19             }
20             if(g[1]-1>=0&&grid[g[1]-1][g[2]]==1) {
21                 grid[g[1]-1][g[2]]=2;
22                 int[] po= {g[0]+1,g[1]-1,g[2]};
23                 q.add(po);            
24             }
25             if(g[2]-1>=0&&grid[g[1]][g[2]-1]==1) {
26                 grid[g[1]][g[2]-1]=2;
27                 int[] po= {g[0]+1,g[1],g[2]-1};
28                 q.add(po);            
29             }
30             if(g[2]+1<w&&grid[g[1]][g[2]+1]==1) {
31                 grid[g[1]][g[2]+1]=2;
32                 int[] po= {g[0]+1,g[1],g[2]+1};
33                 q.add(po);            
34             }
35         }
36         for(int n=0;n<h;++n)
37             for(int m=0;m<w;++m)
38                 if(grid[n][m]==1) 
39                     return -1;
40         return time;
41     }
42 }

 

posted @ 2019-04-19 15:44  你说你好  阅读(640)  评论(0编辑  收藏  举报