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