C++で上昇する水で泳ぐ
1つのNxNグリッドがあり、各正方形グリッド[i] [j]はそのポイント(i、j)での標高を表しているとします。雨が降り始めたと考えてください。時間tでは、あらゆる場所の水深はtです。両方の正方形の高度が最大でtの場合、正方形から別の4方向に隣接する正方形に泳ぐことができます。ゼロ時間で無限の距離を泳ぐことができます。
位置(0、0)から開始する必要があります。右下の正方形(N-1、N-1)に到達するまでの最短時間を見つける必要があります
したがって、入力が次のような場合
0 | 1 | 2 | 3 | 4 |
24 | 23 | 22 | 21 | 5 |
12 | 13 | 15 | 15 | 16 |
11 | 17 | 18 | 19 | 20 |
10 | 9 | 8 | 7 | 6 |
正しい方法は色分けされています。したがって、答えは16になります。
これを解決するには、次の手順に従います-
- データを定義します。これには、時間、x、yなどの3つのパラメータが必要です。
- サイズの配列ディレクトリを定義します:4 x 2:={{1、0}、{-1、0}、{0、1}、{0、-1}}
- n:=グリッドの行、m:=グリッドの列
- 優先キューqを定義する
- 訪問したサイズnxmの2D配列を1つ定義し、これに0を入力します
- visited [0、0]:=1
- Data(grid [0、0]、0、0)をqに挿入します
- (qが空ではない)間、-
- を実行します
- node =qの最上位要素であり、qから要素を削除します
- time:=ノードの時間
- x:=ノードのx、y:=ノードのy
- xがn-1と同じで、yがm-1と同じ場合、-
- 返却時間
- iを初期化する場合:=0、i <4の場合、更新(iを1増やす)、実行-
- nx:=dir [i、0] + x、ny:=dir [i、1] + y
- nx> =0かつnx
=0かつny - visited [nx、y]:=1
- データ(グリッド[nx、ny]と時間、nx、nyの最大値)をqに挿入します
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h> using namespace std; struct Data{ int time, x, y; Data(int a, int b, int y){ time = a; x = b; this->y = y; } }; struct Comparator{ bool operator()(Data a, Data b){ return !(a.time < b.time); } }; int dir[4][2] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1}}; class Solution { public: int swimInWater(vector<vector<int>>& grid) { int n = grid.size(); int m = grid[0].size(); priority_queue <Data, vector <Data>, Comparator> q; vector < vector <int> > visited(n, vector <int>(m, 0)); visited[0][0] = 1; q.push(Data(grid[0][0], 0, 0)); while(!q.empty()){ Data node = q.top(); q.pop(); int time = node.time; int x = node.x; int y = node.y; if(x == n - 1 && y == m - 1)return time; for(int i = 0; i < 4; i++){ int nx = dir[i][0] + x; int ny = dir[i][1] + y; if(nx >= 0 && nx < n && ny >= 0 && ny < m && !visited[nx][ny]){ visited[nx][y] = 1; q.push(Data(max(grid[nx][ny], time), nx, ny)); } } } return -1; } }; main(){ Solution ob; vector<vector<int>> v = {{0,1,2,3,4},{24,23,22,21,5},{12,13,15,15,16},{11,17,18,19,20}, {10,9,8,7,6}}; cout << (ob.swimInWater(v)); }
入力
{{0,1,2,3,4},{24,23,22,21,5},{12,13,15,15,16},{11,17,18,19,20},{10,9,8,7,6}}
出力
16
-
C++でのリスのシミュレーション
木、リス、そしていくつかのナッツがあります。位置は、2Dグリッドのセルで表されます。あなたの目標は、リスがすべてのナッツを集めて、それらを1つずつ木の下に置くための最小距離を見つけることです。リスは一度に最大で1つのナットしかとることができず、隣接するセルに向かって上下左右の4つの方向に移動できます。距離は移動回数で表されます。 したがって、入力が高さ:5幅:7木の位置:[2,2]リス:[4,4]ナッツ:[[3,0]、[2,5]]の場合、出力は12になります。 、 これを解決するには、次の手順に従います- 関数calc()を定義します。これには、x1、y1、x2、y2、が必要で
-
C++の長方形エリアII
(軸に沿った)長方形のリストがあるとします。ここで、各rectangle [i] ={x1、y1、x2、y2}です。ここで、(x1、y1)は左下隅のポイントであり、(x2、y2)は右上隅のポイントです。 i番目の長方形。 平面内のすべての長方形でカバーされる総面積を見つける必要があります。答えは非常に大きい可能性があるため、モジュロ10 ^ 9+7を使用できます。 したがって、入力が次のような場合 その場合、出力は6になります。 これを解決するには、次の手順に従います- m =10 ^ 9 + 7 関数add()を定義します。これには、a、b、が必要です。 r