照らすことができるセルの最大数を見つけるためのC++プログラム
次元h*wのグリッドが与えられていると仮定します。グリッド内のセルには、電球または障害物のいずれかを含めることができます。電球のセルは、その右、左、上、下のセルを照らし、障害物のセルが光を遮らない限り、光はセルを通して輝くことができます。障害物セルは照明できず、電球セルからの光が他のセルに到達するのを防ぎます。文字列の配列でグリッドが与えられます。ここで、「#」は障害物を表し、「。」は障害物を表します。空のセルを表します。電球は1つしかないため、電球をグリッドに最適に配置するために照明できるセルの最大数を見つける必要があります。
したがって、入力がh =4、w =4、grid ={"#..."、 "...."、 "...#"、 "...."}の場合、出力は7になります。
画像から、グリッド内の照らされた細胞を見ることができます。
ステップ
これを解決するには、次の手順に従います-
Define one 2D array first for initialize i := 0, when i < h, update (increase i by 1), do: count := 0 for initialize j := 0, when j < w, update (increase j by 1), do: if grid[i, j] is same as '#', then: count := 0 Ignore following part, skip to the next iteration else: first[i, j] := count (increase count by 1) k := 0 for initialize j := w - 1, when j >= 0, update (decrease j by 1), do: if grid[i, j] is same as '#', then: k := 0 Ignore following part, skip to the next iteration else: k := maximum of k and first[i, j] first[i, j] := k Define one 2D array second for initialize j := 0, when j < w, update (increase j by 1), do: count := 0 for initialize i := 0, when i < h, update (increase i by 1), do: if grid[i, j] is same as '#', then: count := 0 Ignore following part, skip to the next iteration else: second[i, j] := count (increase count by 1) k := 0 for initialize i := h - 1, when i >= 0, update (decrease i by 1), do: if grid[i, j] is same as '#', then: k := 0 Ignore following part, skip to the next iteration else: k := maximum of k and second[i, j] second[i, j] := k result := 0 for initialize i := 0, when i < h, update (increase i by 1), do: for initialize j := 0, when j < w, update (increase j by 1), do: result := maximum of result and first[i, j] + second[i, j] return result + 1>
例
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h> using namespace std; int solve(int h, int w, vector<string> grid){ vector<vector<int>> first(h, vector<int> (w)); for(int i = 0; i < h; i++) { int count = 0; for(int j = 0; j < w; j++) { if(grid[i][j] == '#') { count = 0; continue; } else { first[i][j] = count; count++; } } int k = 0; for(int j = w-1; j >= 0; j--) { if(grid[i][j] == '#') { k = 0; continue; } else { k = max(k, first[i][j]); first[i][j] = k; } } } vector<vector<int>> second(h, vector<int> (w)); for(int j = 0; j < w; j++) { int count = 0; for(int i = 0; i < h; i++) { if(grid[i][j] == '#') { count = 0; continue; } else { second[i][j] = count; count++; } } int k = 0; for(int i = h-1; i >= 0; i--) { if(grid[i][j] == '#') { k = 0; continue; } else { k = max(k, second[i][j]); second[i][j] = k; } } } int result = 0; for(int i = 0; i < h; i++) { for(int j = 0; j < w; j++) { result = max(result, first[i][j] + second[i][j]); } } return result + 1; } int main() { int h = 4, w = 4; vector<string> grid = {"#...", "....", "...#", "...."}; cout<< solve(h, w, grid); return 0; }
入力
4, 4, {"#...", "....", "...#", "...."}
出力
7
-
グラフから減らすことができるスコアの最大量を見つけるためのC++プログラム
n個の頂点とm個のエッジを持つ重み付きの無向グラフがあるとします。グラフのスコアは、グラフ内のすべてのエッジの重みの加算として定義されます。エッジの重みは負の値になる可能性があり、それらを削除するとグラフのスコアが増加します。グラフを接続したまま、グラフからエッジを削除して、グラフのスコアを最小にする必要があります。減らすことができるスコアの最大量を見つける必要があります。 グラフは配列edgesで与えられ、各要素は{weight、{vertex1、vertex2}}の形式です。 したがって、入力がn =5、m =6、edges ={{2、{1、2}}、{2、{1、3}}、{1、{2、3}
-
パスを作成するためにグリッドでブロックするセルの数を見つけるためのC++プログラム
次元h*wのグリッドがあるとします。セル位置(0、0)にロボットがあり、その位置(h-1、w-1)に移動する必要があります。グリッドには、ブロックされたセルとブロックされていないセルの2種類のセルがあります。ロボットはブロックされていないセルを通過できますが、ブロックされたセルを通過することはできません。ロボットは4つの方向に進むことができます。左、右、上、下に移動できます。ただし、ロボットはセルから別のセルに任意の方向に移動する可能性があるため(前のセルを無視して)、1つのパスのみを作成し、そのパスにない他のすべてのセルをブロックする必要があります。 (0、0)から(h -1、w -1)まで