C++でコーナーが1の2値行列に長方形があるかどうかを調べます
バイナリ行列があるとします。与えられた行列に、四隅すべてが1に等しい長方形またはシーケンスがあるかどうかを確認する必要があります。行列は次のようになります
1 | 0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 | 1 |
0 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 |
結果はyesになります。ここに1つの長方形があり、その角は1です。
1 | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 1 |
これを解決するために、1つの効率的なアプローチを使用します。次の手順に従います-
-
マトリックスを上から下に1行ずつスキャンします
-
各行について、2つの1の組み合わせを覚えて、それをハッシュセットにプッシュします。
-
後の行でその組み合わせが再び見つかった場合は、長方形が表示されます。
例
#include<iostream> #include<unordered_set> #include<unordered_map> #include<vector> using namespace std; bool isRectanglePresent(const vector<vector<int> >& matrix) { int rows = matrix.size(); if (rows == 0) return false; int columns = matrix[0].size(); unordered_map<int, unordered_set<int> > table; for (int i = 0; i < rows; ++i) { for (int j = 0; j < columns - 1; ++j) { for (int k = j + 1; k < columns; ++k) { if (matrix[i][j] == 1 && matrix[i][k] == 1) { if (table.find(j) != table.end() && table[j].find(k) != table[j].end()) return true; if (table.find(k) != table.end() && table[k].find(j) != table[k].end()) return true; table[j].insert(k); table[k].insert(j); } } } } return false; } int main() { vector<vector<int> > matrix = { { 1, 0, 0, 1, 0 }, { 0, 0, 1, 0, 1 }, { 0, 0, 0, 1, 0 }, { 1, 0, 1, 0, 1 } }; if (isRectanglePresent(matrix)) cout << "Rectangle is present"; else cout << "Rectangle is not present"; }
出力
Rectangle is present
-
C++で二分木の葉を見つける
二分木があるとします。すべての葉を集めて取り除き、木が空になるまで繰り返します。 したがって、入力が次のような場合 その場合、出力は[[4,5,3]、[2]、[1]]になります。 これを解決するには、次の手順に従います- 1つのマップszを定義する 1つの2D配列retを定義する 関数dfs()を定義します。これはノードを取ります ノードがnullの場合、- sz [ノードの値]:=1 + dfs(ノードの左側)とdfs(ノードの右側)の最大値 retのサイズ
-
C++の中間点を使用して長方形の角を見つける
長方形ABCDがあると仮定しますが、中点PとQの座標、および長方形Lの長さしかありません。 私たちのタスクは、PとQの座標、および辺Lの長さを使用して、A、B、C、およびDの座標を見つけることです。たとえば、Pが(1、0)、Qが(1、2)の場合、およびLが2の場合、A、B、C、Dはそれぞれ(0、0)、(0、2)、(2、2)になります。 (2、0)。 発生する可能性のあるケースは3つあります。 長方形は水平であるため、ADとBCはX軸に平行です 長方形は垂直であるため、ADとBCはY軸に平行です 長方形は軸に対して特定の角度で傾斜しています。 3番目のケースでは、PとQの座標を使