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 }