C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

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

  1. C++で二分木の葉を見つける

    二分木があるとします。すべての葉を集めて取り除き、木が空になるまで繰り返します。 したがって、入力が次のような場合 その場合、出力は[[4,5,3]、[2]、[1]]になります。 これを解決するには、次の手順に従います- 1つのマップszを定義する 1つの2D配列retを定義する 関数dfs()を定義します。これはノードを取ります ノードがnullの場合、- sz [ノードの値]:=1 + dfs(ノードの左側)とdfs(ノードの右側)の最大値 retのサイズ

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