<leetcode c++>778. 水位上升的泳池中游泳
阿新 • • 發佈:2021-01-31
題目連結——778. 水位上升的泳池中游泳
在一個 N x N 的座標方格 grid 中,每一個方格的值 grid[i][j] 表示在位置 (i,j) 的平臺高度。
現在開始下雨了。當時間為 t 時,此時雨水導致水池中任意位置的水位為 t 。你可以從一個平臺遊向四周相鄰的任意一個平臺,但是前提是此時水位必須
同時淹沒這兩個平臺。假定你可以瞬間移動無限距離,也就是預設在方格內部遊動是不耗時的。當然,在你游泳的時候你必須待在座標方格里面。
你從座標方格的左上平臺 (0,0) 出發。最少耗時多久你才能到達座標方格的右下平臺 (N-1, N-1) ?
示例 1:
輸入: [[0,2],[1,3]]
輸出: 3
解釋:
時間為0時,你位於座標方格的位置為 (0, 0)。
此時你不能遊向任意方向,因為四個相鄰方向平臺的高度都大於當前時間為 0 時的水位。
等時間到達 3 時,你才可以遊向平臺 (1, 1). 因為此時的水位是 3,座標方格中的平臺沒有比水位 3 更高的,所以你可以遊向座標方格中的任意位置
示例2:
輸入: [[0,1,2,3,4],[24,23,22,21,5],[12,13,14,15,16],[11,17,18,19,20],[10,9,8,7,6]]
輸出: 16
解釋:
0 1 2 3 4
24 23 22 21 5
12 13 14 15 16
11 17 18 19 20
10 9 8 7 6
最終的路線用加粗進行了標記。
我們必須等到時間為 16,此時才能保證平臺 (0, 0) 和 (4, 4) 是連通的
提示:
2 <= N <= 50.
grid[i][j] 是 [0, ..., N*N - 1] 的排列。
我們可以使用二分查詢 + dfs/bfs的方法,用二分查詢來找到最小滿足條件的時間, 是否滿足可以從(0, 0) 到 (m - 1, m - 1)用深度/廣度優先遍歷來判斷。
class Solution {
public:
int dx[4] = {1, -1, 0 , 0};
int dy[4] = {0, 0, 1, -1};
bool dfs(vector<vector<int>>& grid, int x, int y, int t, vector<vector<bool>>& vis, int m){
if(x == m - 1 && y == m - 1) return true;
for(int i = 0; i < 4; i++){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx >= 0 && nx < m && ny >= 0 && ny < m && !vis[nx][ny] && grid[nx][ny] <= t){
vis[nx][ny] = true;
if(dfs(grid, nx, ny, t, vis, m))
return true;
}
}
return false;
}
bool bfs(vector<vector<int>>& grid, int t, int m){
vector<vector<bool>> vis(m, vector<bool>(m, false));
queue<int> q;
q.push(0);
while(!q.empty()){
int tx = q.front()/100;
int ty = q.front()%100;
if(tx == m - 1 && ty == m - 1)return true;
q.pop();
for(int i = 0; i < 4; i++){
int nx = tx + dx[i];
int ny = ty + dy[i];
if(nx < 0 || nx >= m || ny < 0 || ny >= m || vis[nx][ny] || grid[nx][ny] > t)continue;
vis[nx][ny] = true;
q.push(nx * 100 + ny);
}
}
return false;
}
int swimInWater(vector<vector<int>>& grid) {
//二分+BFS
int m = grid.size();
int l = max(grid[m - 1][m - 1], grid[0][0]), r = m * m - 1;
while(l < r){
vector<vector<bool>> vis(m, vector<bool>(m, false));
int mid = l + (r - l)/2;
if(dfs(grid, 0, 0, mid, vis, m))
//if(bfs(grid, mid, m))
r = mid;
else
l = mid + 1;
}
return l;
}
};