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

C++のバイナリ行列で1で形成された形状の周囲を検索します


この問題では、0と1のみで構成されるサイズnXmのバイナリ行列bin[][]が与えられます。私たちのタスクは、バイナリ行列で1で形成された形状の周囲を見つけることです。

取られた周囲は、すべての側面から図をカバーします。つまり、

1つの単一値の場合、周囲長は4です。

C++のバイナリ行列で1で形成された形状の周囲を検索します

問題を理解するために例を見てみましょう

入力

bin[][] = [1, 0]
   [1, 0]

出力

6

説明

セル(0,0)と(1、0)は、辺2と1の長方形を作るように接続されています。周囲長は6です。

ソリューションアプローチ

この問題の簡単な解決策は、1つすべてとその境界への寄与を見つけてから、すべてを加算して値を見つけることです。

行列の周囲への1の寄与は、次のとおりです。1だけが周囲に寄与する場合、最大の寄与は4です

1がすべての側面で1に囲まれている場合、最小の寄与は0です。

したがって、行列の各要素について、それが1であるかどうかを確認する必要があります。 all1の場合、隣接するものを見つけて、境界に貢献し、最後に境界を見つけます。

ソリューションの動作を説明するプログラム

#include<iostream>
using namespace std;
#define R 3
#define C 5
int contibutionToPerimeter(int mat[][C], int i, int j) {
   int neighbours = 0;
   if (i > 0 && mat[i - 1][j])
      neighbours++;
   if (j > 0 && mat[i][j - 1])
      neighbours++;
   if (i < R-1 && mat[i + 1][j])
      neighbours++;
   if (j < C-1 && mat[i][j + 1])
      neighbours++;
   return (4 - neighbours);
}
int calcPerimeter(int mat[R][C]){
   int perimeter = 0;
   for (int i = 0; i < R; i++)
      for (int j = 0; j < C; j++)
         if (mat[i][j] == 1)
            perimeter += contibutionToPerimeter(mat, i ,j);
   return perimeter;
}
int main() {
   int mat[R][C] = { {0, 1, 0, 0, 0},
   {1, 1, 1, 1, 0},
   {1, 1, 0, 1, 1} };
   cout<<"The perimeter of shapes from formed with 1s is "<<calcPerimeter(mat);
   return 0;
}

出力

The perimeter of shapes from formed with 1s is 18

  1. C++で三角形の周囲を検索

    この問題では、三角形の周囲長、さまざまなタイプの三角形の周囲長の式、およびそれらを見つけるためのプログラムを確認します。 境界 フィギュアの周りの合計距離として定義されます。基本的に、それは与えられた図のすべての辺の合計です。 三角形の周囲 三角形の周囲は、その3つの辺すべての合計です(三角形は3つの辺の図です)。 式、 Perimeter = sum of all sides Perimeter = x + y + z 三角形の周囲を見つけるプログラム 例 #include <iostream> using namespace std; int calcPe

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

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