糖逗 发表于 2021-1-30 15:36:43

C++刷LeetCode(778. 水位上升的泳池中游泳)【深度优先搜索】【二分查找法】

题目描述:
在一个 N x N 的坐标方格 grid 中,每一个方格的值 grid 表示在位置 (i,j) 的平台高度。

现在开始下雨了。当时间为 t 时,此时雨水导致水池中任意位置的水位为 t 。你可以从一个平台游向四周相邻的任意一个平台,但是前提是此时水位必须同时淹没这两个平台。假定你可以瞬间移动无限距离,也就是默认在方格内部游动是不耗时的。当然,在你游泳的时候你必须待在坐标方格里面。

你从坐标方格的左上平台 (0,0) 出发。最少耗时多久你才能到达坐标方格的右下平台 (N-1, N-1)?

 

示例 1:

输入: [,]
输出: 3
解释:
时间为0时,你位于坐标方格的位置为 (0, 0)。
此时你不能游向任意方向,因为四个相邻方向平台的高度都大于当前时间为 0 时的水位。

等时间到达 3 时,你才可以游向平台 (1, 1). 因为此时的水位是 3,坐标方格中的平台没有比水位 3 更高的,所以你可以游向坐标方格中的任意位置
示例2:

输入: [,,,,]
输出: 16
解释:
01234
24 23 22 215
12 13 14 15 16
11 17 18 19 20
109876

最终的路线用加粗进行了标记。
我们必须等到时间为 16,此时才能保证平台 (0, 0) 和 (4, 4) 是连通的
 

提示:

2 <= N <= 50.
grid 是 的排列。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/swim-in-rising-water
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。



class Solution {
private:
    int len1, len2;
    vector<vector<int> >direct = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
public:
    bool dfs(vector<vector<int> >&grid, vector<vector<bool> >&visit, int x, int y, int res){
      if(x == len1 - 1 && y == len2 - 1){
            return true;
      }
      visit = true;
      for(auto cha : direct){
            int temp1 = x + cha;
            int temp2 = y + cha;
            if(temp1 >= 0 && temp1 < len1 && temp2 >= 0 && temp2 < len2 && visit == false && grid < res && grid < res){
                if(dfs(grid, visit, temp1, temp2, res))return true;//所有可能路径,不需要回溯
            }
      }
      return false;

    }
    int swimInWater(vector<vector<int>>& grid) {
      //二分查找+深度优先搜索
      len1 = grid.size(), len2 = grid.size();
      int left = 0, right = INT_MAX;
      while(left <= right){
            int mid = left + (right - left) / 2;
            vector<vector<bool> >visit(len1, vector<bool>(len2, false));
            if(!dfs(grid, visit, 0, 0, mid)){
                left = mid + 1;
            }else{
                right = mid - 1;
            }
      }
      return left-1;
    }
};


参考链接:https://leetcode-cn.com/problems/swim-in-rising-water/solution/cmo-gai-leetcode-1631-by-heroding-99vh/
页: [1]
查看完整版本: C++刷LeetCode(778. 水位上升的泳池中游泳)【深度优先搜索】【二分查找法】