1. 程式人生 > 其它 ><leetcode c++>778. 水位上升的泳池中游泳

<leetcode c++>778. 水位上升的泳池中游泳

技術標籤:leetcodedfsbfs二分查詢

題目連結——778. 水位上升的泳池中游泳

在一個 N x N 的座標方格 grid 中,每一個方格的值 grid[i][j] 表示在位置 (i,j) 的平臺高度。

現在開始下雨了。當時間為 t 時,此時雨水導致水池中任意位置的水位為 t 。你可以從一個平臺遊向四周相鄰的任意一個平臺,但是前提是此時水位必須
同時淹沒這兩個平臺。假定你可以瞬間移動無限距離,也就是預設在方格內部遊動是不耗時的。當然,在你游泳的時候你必須待在座標方格里面。

你從座標方格的左上平臺 (00) 出發。最少耗時多久你才能到達座標方格的右下平臺 (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; } };