• Leetcode 994. 腐烂的橘子


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

    值 0 代表空单元格;
    值 1 代表新鲜橘子;
    值 2 代表腐烂的橘子。
    每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。

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

    示例 1:

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

    输入:[[2,1,1],[0,1,1],[1,0,1]]
    输出:-1
    解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个正向上。
    示例 3:

    输入:[[0,2]]
    输出:0
    解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。
     

    提示:

    1 <= grid.length <= 10
    1 <= grid[0].length <= 10
    grid[i][j] 仅为 0、1 或 2

    思路:我就是补丁狂人,疯狂打补丁然后就过了,害

    dfs,直接从腐烂的橘子出发,遍历周围的4个方向如果是1就赋值为times,当然要特判一下是否超过边界,

    而且因为是多源,所以可以check一下当前的times是否小于之前赋值,如果小就替换掉

    然后再特判一下没有腐烂橘子,没有正常橘子的情况就好了

     1 class Solution {
     2 public:
     3     int vis[20][20];
     4     void dfs(vector<vector<int> >& grid,int i,int j, int x, int y, int times) {
     5         //vis[i][j] = 1;
     6         if((i + 1 >= 0 && i + 1 < x) && grid[i + 1][j] == 1 && (times < vis[i + 1][j] || vis[i + 1][j] == 0))
     7         {
     8             vis[i+1][j] = times;
     9             dfs(grid, i+1, j , x, y, times + 1);
    10         }
    11         if((i - 1 >= 0 && i - 1 < x) && grid[i - 1][j] == 1 && (times < vis[i - 1][j] || vis[i - 1][j] == 0))
    12         {
    13             vis[i - 1][j] = times;
    14             dfs(grid, i - 1, j , x, y, times + 1);
    15         }
    16 
    17         if((j - 1 >= 0 && j - 1 < y) && grid[i][j - 1] == 1 && (times < vis[i][j - 1] || vis[i][j-1] == 0))
    18         {
    19             vis[i][j - 1] = times;
    20             dfs(grid, i, j - 1, x, y, times + 1);
    21         }
    22 
    23         if((j + 1 >= 0 && j + 1 < y) && grid[i][j + 1] == 1 && (times < vis[i][j + 1] || vis[i][j+1] == 0))
    24         {
    25             vis[i][j + 1] = times;
    26             dfs(grid, i, j + 1, x, y, times + 1);
    27         }
    28     }
    29     int orangesRotting(vector<vector<int> >& grid) {
    30         memset(vis,0,sizeof(vis));
    31         int one =0,two =0;
    32         for(int i = 0 ;i < grid.size();i++)
    33         {
    34             for(int j = 0; j < grid[0].size(); j ++)
    35             {
    36                 if(grid[i][j] == 1)
    37                 {
    38                     one++;
    39                 }
    40                 if(grid[i][j] == 0)
    41                     vis[i][j] = -1;
    42                 if(grid[i][j] == 2)
    43                 {
    44                     vis[i][j] = -2;
    45                     two++;
    46                     dfs(grid, i, j, grid.size(), grid[0].size(), 1);
    47                 }
    48             }
    49         }
    50         if(one ==0 && two != 0)
    51             return 0;
    52         if(one ==0 && two ==0)
    53             return 0;
    54         if(two == 0)
    55             return -1;
    56         int ans = -1,flag = -1, flag2 = -1;
    57         for(int i = 0 ;i < grid.size();i++)
    58         {
    59             for(int j = 0; j < grid[0].size(); j ++)
    60             {
    61                 if(vis[i][j] > 0)
    62                     flag2 = 1;
    63                 if(vis[i][j] == 0 )
    64                     flag = 1;
    65                 if(vis[i][j] > ans)
    66                     ans = vis[i][j];
    67             }
    68         }
    69         if(flag2 != -1)
    70             return flag == -1 ? ans : -1;
    71         else {
    72             if(two <0)
    73                 return 0;
    74             else return -1;
    75         }
    76     }
    77 };
    78 /*
    79   2 1 1
    80   0 1 1
    81   1 0 1
    82 
    83   0 1
    84   2 0
    85 
    86   2 1 1
    87   1 1 0
    88   0 1 1
    89 */
    View Code
  • 相关阅读:
    Jeecms之查询实现
    JEECMS站群管理系统-- 自定义标签及使用自己创建的表的实现过程
    jeecms 修改后台访问路径
    Jeecms6中后台控制层Action如何将值传入前台视图层模板中的?
    原 JEECMS导入IDEA进行二次开发图文教程
    自己动手编写JEECMS自定义栏目统计标签
    深入浅出 Java Concurrency (8): 加锁的原理 (Lock.lock)
    深入浅出 Java Concurrency (7): 锁机制 part 2 AQS
    深入浅出 Java Concurrency (6): 锁机制 part 1 Lock与ReentrantLock
    深入浅出 Java Concurrency (5): 原子操作 part 4 CAS操作
  • 原文地址:https://www.cnblogs.com/tijie/p/12144088.html
Copyright © 2020-2023  润新知