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

C++での閉鎖された島の数


0(土地として)と1(水として)で構成される2Dグリッドがあるとします。島は、最大4方向に接続された0のグループです。閉じた島は、完全に1で囲まれた島です。閉じた島の数を見つける必要があります。したがって、グリッドが次のような場合

1 1 1 1 1 1 1 0
1 0 0 0 0 1 1 0
1 0 1 0 1 1 1 0
1 0 0 0 0 1 0 1
1 1 1 1 1 1 1 0

したがって、出力は2になります。完全に水に囲まれた2つの島があります。

これを解決するには、次の手順に従います-

  • 変数フラグを定義する

  • dfsと呼ばれるメソッドを定義します。これにより、グリッドi、j、n、およびmが取得されます

  • iとjがグリッドの範囲内にない場合は、フラグ:=falseを設定して戻ります
  • g [i、j] =1またはg[i、j] =-1の場合、戻り値

  • g [i、j] =0の場合、g [i、j] =-1

  • dfs(g、i + 1、j、n、m)、dfs(g、i、j + 1、n、m)、dfs(g、i-1、j、n、m)、dfs(g、 i、j-1、n、m)

  • 主な方法は次のようになります-

  • 次数nxmのdp行列を作成し、-1で埋めます

  • 0からn–1の範囲のiの場合

    • 0からm–1の範囲のjの場合

      • g [i、j] =0の場合、

        • フラグ:=true

        • dfs(g、i、j、n、m)

        • フラグ:=true

        • ans:=ans+フラグ

  • ansを返す

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   vector < vector <int> > dp;
   bool flag;
   void dfs(vector<vector<int>>& g, int i, int j, int n, int m){
      if(i>=n || j >=m || i<0 || j<0){
         flag = false;
         return ;
      }
      if(g[i][j] == 1 || g[i][j] == -1)return;
      if(g[i][j] == 0)g[i][j] = -1;
      dfs(g, i+1, j, n, m);
      dfs(g, i, j+1, n, m);
      dfs(g, i-1, j, n, m);
      dfs(g,i, j-1, n, m);
   }
   int closedIsland(vector<vector<int>>& g) {
      int ans = 0;
      int n = g.size();
      int m = g[0].size();
      dp = vector < vector <int> > (n, vector <int> (m, -1));
      for(int i = 0; i < n ; i++){
         for(int j = 0; j < m; j++){
            if(g[i][j] == 0){
               flag = true;
               dfs(g, i , j ,n ,m);
               ans += flag;
            }
         }
      }
   return ans;
   }
};
main(){
   vector<vector<int>> v =
   {{1,1,1,1,1,1,1,0},{1,0,0,0,0,1,1,0},{1,0,1,0,1,1,1,0},{1,0,0,0,0,1,0
   ,1},{1,1,1,1,1,1,1,0}};
   Solution ob;
   cout << (ob.closedIsland(v));
}

入力

[[1,1,1,1,1,1,1,0],[1,0,0,0,0,1,1,0],[1,0,1,0,1,1,1,0],[1,0,0,0,0,1,0,1],[1,1,1,1,1,1,1,0]]

出力

2

  1. C++での質素な数

    この問題では、正の整数Nが与えられます。私たちのタスクは、与えられた数が質素な数であるかどうかをチェックするプログラムを作成することです。 不正な番号 −指定された数の素因数分解の桁数よりも厳密に桁数が多い数。 例 − 625、数625の素因数は5 4です。 。 625の桁数は3です。 5 4の桁数 は2です。 3は厳密に2より大きくなります。したがって、625は質素な数です。 最初のいくつかの質素な数は − 125、128、243、256、343、512、625など。 問題を理解するために例を見てみましょう Input: n = 128 Output: Frugal n

  2. C++五胞体数

    五胞体数は、パスカルの三角形の5番目の数として表されます。ご存知のように、これは5番目の数字です。つまり、パスカルの三角形に少なくとも5つの数字が必要です。したがって、このシリーズの最初の数字は 1 4 6 4 1から始まります。 パスカルの三角形の4行目。したがって、このチュートリアルでは、たとえば、n番目の五胞体数を見つける必要があります Input : 1 Output : 1 Input : 4 Output : 35 次の図から出力を確認できます- この問題については、可能な限り、これは一種のシリーズであるため、ソリューションでこのシリーズのパターンを見つけようと