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の座標を使