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

Pythonで水に完全に囲まれているすべての島を削除するプログラム


1が土地を表し、0が水を表すバイナリ行列があるとします。また、島は1のグループであり、0(水)またはエッジで囲まれています。完全に水に囲まれているすべての島を見つけて、それらを0に変更する必要があります。私たちが知っているように、すべての隣人(斜めではなく水平と垂直)が0の場合(隣人のどれもエッジではない)、島は水に囲まれて完成します。

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

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

その場合、出力は次のようになります

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

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

  • 行:=Aの行数

  • col:=Aの列数

  • B:=サイズAの行列で、0で埋める

  • 見た:=新しいセット

  • 0から行までの範囲のiの場合、実行

    • 0からcolの範囲のjについては、次のようにします

      • iとjが行列の範囲内にない場合、

        • 次のイテレーションに行く

      • (i、j)が見られる場合、

        • 次のイテレーションに行く

      • A [i、j]が0と同じ場合、

        • 次のイテレーションに行く

      • d:=1つの要素(i、j)を持つ両端キュー

      • dは空ではありませんが、実行してください

        • (x、y):=dの左側の要素、およびdから削除

        • B [x、y]:=1

        • (x、y)の各ネイバー(x2、y2)に対して、実行

          • (x2、y2)が表示されない場合、

            • dの最後に(x2、y2)を挿入します

            • 見られるように(x2、y2)をマークします

  • Bを返す

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

from collections import deque
class Solution:
   def solve(self, A):
      row = len(A)
      col = len(A[0])
      B = [[0 for _ in range(col)] for _ in range(row)]
      seen = set()
      def nei(i, j):
         if i + 1 < row and A[i + 1][j]:
            yield (i + 1, j)
         if j + 1 < col and A[i][j + 1]:
            yield (i, j + 1)
         if i - 1 >= 0 and A[i - 1][j]:
            yield (i - 1, j)
         if j - 1 >= 0 and A[i][j - 1]:
            yield (i, j - 1)
         for i in range(row):
            for j in range(col):
               if i not in (0, row - 1) and j not in (0, col - 1):
                  continue
               if (i, j) in seen:
                  continue
               if A[i][j] == 0:
                  continue
               d = deque([(i, j)])
               while d:
                  x, y = d.popleft()
                  B[x][y] = 1
                  for x2, y2 in nei(x, y):
                     if (x2, y2) not in seen:
                        d.append((x2, y2))
                        seen.add((x2, y2))
         return B
ob = Solution()
matrix = [
   [1, 0, 0, 0],
   [0, 1, 1, 0],
   [0, 1, 1, 0],
   [0, 1, 1, 0],
   [0, 0, 0, 1],
]
print(ob.solve(matrix))

入力

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

出力

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

  1. Pythonで行列内の囲まれた島の数を数えるプログラム

    バイナリ行列があるとします。ここで、1は土地を表し、0は水を表します。私たちが知っているように、島は周囲が水に囲まれているグループ化された1のグループです。完全に囲まれた島の数を見つける必要があります。 したがって、入力が次のような場合 3つの島があるため、出力は2になりますが、そのうちの2つは完全に囲まれています。 これを解決するには、次の手順に従います- 関数dfs()を定義します。これにはi、jが必要です iとjが行列の範囲内にない場合、 Falseを返す matrix [i、j]が0と同じ場合、 Trueを返す matrix [i、j]:=0 a:=df

  2. Pythonの範囲内にないすべてのノードをBSTから削除するプログラム

    低値と高値の2つの値を持つBSTがあるとすると、[低、高](両端を含む)の間にないすべてのノードを削除する必要があります。 したがって、入力が次のような場合 低=7高=10の場合、出力はになります。 これを解決するには、次の手順に従います- 関数solve()を定義します。これは根を下ろし、低く、高くなります rootがnullの場合、 戻る returnsolve(ルートの右、低、高) ルートのデータが高い場合は returnsolve(ルートの左側、低、高) ルートの権利:=solve(ルートの権利、低、高) ルートの左側:=solve(ルートの左側