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

Pythonの2つのマップで重複する島の数をカウントするプログラム


2つのバイナリ行列mat1とmat2があるとします。ここで、1は土地を表し、0は水を表します。水に囲まれた1(土地)のグループがある場合、島と呼ばれます。 mat1とmat2の両方にまったく同じ座標で存在する島の数を見つける必要があります。

したがって、入力がmat1 =

のような場合
1 0 1
1 0 0
1 0 0

そしてmat2=

1 0 1
1 0 0
1 0 1

重なり合う島は2であるため、出力は2になります。

1 0 1
1 0 0
1 0 1

したがって、2つの重なり合う島があります。

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

  • r:=mat1の行数
  • c:=mat1の列数
  • last_row:=r-1
  • last_col:=c-1
  • 関数mark()を定義します。これにはi、jが必要です
  • mat1 [i、j]:=0
  • mat2 [i、j]:=0
  • iがゼロ以外で、(mat1 [i-1、j]またはmat2 [i-1、j]いずれか1つがゼロ以外)の場合、
    • mark(i-1、j)
  • jがゼロ以外で(mat1 [i、j-1]またはmat2 [i、j-1]いずれか1つがゼロ以外)の場合、
    • mark(i、j-1)
  • j
  • mark(i、j + 1)
  • i
  • mark(i + 1、j)
  • メインの方法から、次の手順を実行します-
  • 0からr-1の範囲のiの場合、do
    • 0からc-1の範囲のjの場合、do
      • mat1 [i、j]がmat2 [i、j]と同じでない場合、
        • mark(i、j)
  • 島:=0
  • 0からr-1の範囲のiの場合、do
    • 0からc-1の範囲のjの場合、do
      • mat1 [i、j]がゼロ以外の場合、
        • 島:=島+1
        • mark(i、j)
  • 島を返す
  • 理解を深めるために、次の実装を見てみましょう-

    def solve(mat1, mat2):
       r = len(mat1)
       c = len(mat1[0])
       last_row = r - 1
       last_col = c - 1
    
       def mark(i, j):
          mat1[i][j] = mat2[i][j] = 0
          if i and (mat1[i - 1][j] or mat2[i - 1][j]):
             mark(i - 1, j)
          if j and (mat1[i][j - 1] or mat2[i][j - 1]):
             mark(i, j - 1)
          if j < last_col and (mat1[i][j + 1] or mat2[i][j + 1]):
             mark(i, j + 1)
          if i < last_row and (mat1[i + 1][j] or mat2[i + 1][j]):
             mark(i + 1, j)
    
       for i in range(r):
          for j in range(c):
             if mat1[i][j] != mat2[i][j]:
                mark(i, j)
    
       islands = 0
       for i in range(r):
          for j in range(c):
             if mat1[i][j]:
                islands += 1
                mark(i, j)
       return islands
    
    mat1 = [
    [1, 0, 1],
    [1, 0, 0],
    [1, 0, 1]
    ]
    mat2 = [
    [1, 0, 1],
    [1, 0, 0],
    [1, 0, 0]
    ]
    print(solve(mat1, mat2))

    入力

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

    出力

    2

    1. PythonでnノードのBSTの数をカウントするプログラム

      n個の異なるノードがあるとします。すべてが異なります。二分探索木を形成するためにそれらを配置できる方法の数を見つける必要があります。二分探索木で知っているように、左側のサブツリーは常に小さい値を保持し、右側のサブツリーは大きい値を保持します。 これを解決するために、カタラン数を見つけます。カタラン数C(n)は、n個の異なるキーを持つ二分探索木を表します。式は次のようになります $$ C(n)=\ frac {(2n)!} {(n + 1)!\ times n!} $$ したがって、入力がn =3の場合、出力は5になります。 これを解決するには、次の手順に従います- 関数ncr

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

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