C++で黒いピクセルを囲む最小の長方形
画像があり、その画像が、0が白のピクセル、1が黒のピクセルのバイナリ行列で表されているとします。ここでは黒いピクセルが接続されているため、黒い領域は1つだけです。ピクセルは水平方向と垂直方向に接続されています。黒のピクセルの1つの位置(x、y)がある場合、すべての黒のピクセルを囲む最小の(軸に沿った)長方形の領域を見つける必要があります。
したがって、入力が次のような場合
0 | 0 | 1 | 0 |
0 | 1 | 1 | 0 |
0 | 1 | 0 | 0 |
x =0、y =2の場合、出力は6になります
これを解決するには、次の手順に従います-
-
1つの2Dアレイvを定義する
-
関数searchRows()を定義します。これには、i、j、左、右、1つが必要です
-
i
-
mid:=i +(j --i)/ 2
-
k:=左
-
(k<右およびv[mid、k]は '0'と同じ)、do-
-
(kを1増やします)
-
-
k <'rightが1と同じ場合、-
-
j:=mid
-
-
それ以外の場合
-
i:=mid + 1
-
-
-
iを返す
-
関数searchColumn()を定義します。これには、i、j、top、bottom、one、
が必要です。 -
iがjと等しくない場合は、次のようにします-
-
mid:=i +(j --i)/ 2
-
k:=トップ
-
(k
-
(kを1増やします)
-
-
k
-
j:=mid
-
-
それ以外の場合
-
i:=mid + 1
-
-
-
iを返す
-
メインの方法から、次のようにします-
-
v:=画像
-
ret:=0
-
n:=画像の行サイズ
-
m:=画像の列サイズ
-
top:=searchRows(0、x、0、m、true)
-
下:=searchRows(x + 1、n、0、m、false)
-
左:=searchColumn(0、y、top、bottom、true)
-
右:=searchColumn(y + 1、m、top、bottom、false)
-
戻る(右-左)*(下-上)
例
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h> using namespace std; class Solution { public: vector < vector <char> > v; int searchRows(int i, int j, int left, int right, bool one){ while (i < j) { int mid = i + (j - i) / 2; int k = left; while (k < right && v[mid][k] == '0') k++; if (k < right == one) { j = mid; } else { i = mid + 1; } } return i; } int searchColumn(int i, int j, int top, int bottom, bool one){ while (i != j) { int mid = i + (j - i) / 2; int k = top; while (k < bottom && v[k][mid] == '0') k++; if (k < bottom == one) { j = mid; } else { i = mid + 1; } } return i; } int minArea(vector<vector<char>>& image, int x, int y) { v = image; int ret = 0; int n = image.size(); int m = image[0].size(); int top = searchRows(0, x, 0, m, true); int bottom = searchRows(x + 1, n, 0, m, false); int left = searchColumn(0, y, top, bottom, true); int right = searchColumn(y + 1, m, top, bottom, false); return (right - left) * (bottom - top); } }; main(){ Solution ob; vector<vector<char>> v = {{'0','0','1','0'},{'0','1','1','0'},{'0','1','0','0'}}; cout << (ob.minArea(v, 0, 2)); }
入力
{{'0','0','1','0'},{'0','1','1','0'},{'0','1','0','0'}}, 0, 2
出力
6
-
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
-
C++の長方形領域
2D平面内の2つの直線状の長方形で覆われる総面積を求めたいとします。ここで、各長方形は、図に示すように、左下隅と右上隅によって定義されます。 これを解決するには、次の手順に従います- =HまたはD<=Fの場合、 return(C – A)*(D – B)+(G – E)*(H – F) 配列hを定義し、A、C、E、Gをhに挿入します 配列vを定義し、B、D、F、Hをvに挿入します h配列の並べ替えとv配列の並べ替え temp:=(h [2] – h [1])*(v [2] – v [1]) 合計:=temp 合計:=合計+(C – A