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

Pythonの特定の行列からいくつかの異なる島の形状を見つけるプログラム


2次元のバイナリ行列があるとすると、与えられた行列内の個別の島の数を見つける必要があります。ここで、1は土地を表し、0は水を表します。したがって、島は1のセットであり、その周囲は水に囲まれています。ここでは、形が異なる場合、2つの島がユニークです。

したがって、入力が次のような場合

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

その場合、出力は4になります(異なる島は異なる色になります)。

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

  • 関数dfs()を定義します。これにはi、j、k、lが必要です

  • mat [i、j]:=0

  • 形状の最後にペア(i − k、j − l)を挿入します

  • i +1<マットの行数およびmat[i+ 1、j]が1の場合、

    • dfs(i + 1、j、k、l)

  • j + 1

    • dfs(i、j + 1、k、l)

  • i − 1> =0で、mat [i − 1、j]が1の場合、

    • dfs(i − 1、j、k、l)

  • j − 1> =0で、mat [i、j − 1]が1の場合、

    • dfs(i、j − 1、k、l)

  • メインの方法から、次のようにします-

  • cnt:=0

  • 形状:=新しいセット

  • 0からマットの行数までの範囲のiの場合、実行します

    • 0からマットの列数までの範囲のjについては、次のようにします

      • mat [i、j]が1の場合、

        • shape:=新しいリスト

        • dfs(i、j、i、j)

        • 形が形になっていない場合は

          • cnt:=cnt + 1

        • 図形を図形に挿入する

  • cntを返す

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

class Solution:
   def solve(self, mat):
      def dfs(i, j, k, l):
         mat[i][j] = 0
         shape.append((i − k, j − l))
      if i + 1 < len(mat) and mat[i + 1][j]:
         dfs(i + 1, j, k, l)
      if j + 1 < len(mat[0]) and mat[i][j + 1]:
         dfs(i, j + 1, k, l)
      if i − 1 >= 0 and mat[i − 1][j]:
         dfs(i − 1, j, k, l)
      if j − 1 >= 0 and mat[i][j − 1]:
         dfs(i, j − 1, k, l)
   cnt = 0
   shapes = set()
      for i in range(len(mat)):
         for j in range(len(mat[0])):
            if mat[i][j]:
               shape = []
               dfs(i, j, i, j)
               shape = tuple(shape)
               if shape not in shapes:
                  cnt += 1
                  shapes.add(shape)
      return cnt
ob = Solution()
matrix = [
   [1, 0, 0, 0, 0],
   [1, 0, 1, 0, 1],
   [0, 1, 1, 0, 1],
   [0, 0, 1, 0, 0],
   [1, 0, 0, 0, 0],
   [1, 1, 0, 1, 1]
]
print(ob.solve(matrix))

入力

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

出力

4

  1. Pythonで与えられた行列の転置を見つけるプログラム

    (n x n)行列Mがあるとすると、その転置を見つける必要があります。私たちが知っているように、行列の転置は行と列のインデックスを切り替えます。より正式には、すべてのrとcについて、matrix [r] [c] =matrix[c][r]。 したがって、入力が次のような場合 7 2 6 3 7 2 5 3 7 その場合、出力は次のようになります 7 3 5 2 7 3 6 2 7 これを解決するには、次の手順に従います- M:=新しいリスト トラッカー:=0 トラッカー<

  2. Pythonの2Dマトリックスで個別の島の数を見つける

    バイナリ行列があるとします。その中の島の数を数える必要があります。島とは、水に囲まれ、隣接する土地を水平または垂直につなぐことで形成される場所です。グリッドの4つのエッジすべてがすべて水に囲まれていると想定できます。 グリッドが-のようであると仮定します 1 1 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 1 1 3つの島があります。 これを解決するには、次の手順に従います- 2つのメソッドがあります。1つはnumIslands()およびmakeWater()と