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

Pythonを使用してバイナリグリッドを配置するための最小スワップを見つけるプログラム


nxnのバイナリ行列があるとします。 1つのステップで、隣接する2つの行を選択し、それらを入れ替えるような操作を実行できます。行列の主対角線より上のすべてのノードが0になるように、必要な最小スワップの数をカウントする必要があります。そのような解決策がない場合は、-1を返します。

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

0 1 0
0 1 1
1 0 0

-

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

Pythonを使用してバイナリグリッドを配置するための最小スワップを見つけるプログラム

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

  • n:=行列の行数

  • m:=サイズnの配列を作成し、nで埋めます

  • 0からn-1の範囲のiの場合、実行

    • n-1から0の範囲のjの場合、1ずつ減らします。

      • matrix [i、j]が1と同じ場合、

        • m [i]:=n-j-1

        • ループから出てきます

  • t:=0、ans:=0

  • 0からn-1の範囲のiの場合、実行

    • t:=t + 1

    • フラグ:=False

    • iからn-1の範囲のjの場合、実行

      • m [j]> =n-tの場合、

        • ans:=ans + j-i

        • フラグ:=True

        • ループから出てきます

    • フラグがfalseの場合、

      • -1を返す

    • m[インデックスi+1からjへ]をm[インデックスiからj-1へ]で更新

  • ansを返す

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

def solve(matrix):
   n = len(matrix)
   m = [n] * n
   for i in range(n):
      for j in range(n-1,-1,-1):
         if matrix[i][j] == 1:
            m[i] = n-j-1
            break
   t,ans = 0,0
   for i in range(n):
      t += 1
      flag = False
      for j in range(i,n):
         if m[j] >= n-t:
            ans += j-i
            flag = True
            break
      if not flag: return -1
      m[i+1:j+1] = m[i:j]
   return ans
matrix = [[0,1,0],[0,1,1],[1,0,0]]
print(solve(matrix))

入力

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

出力

2

  1. Pythonを使用してバイナリツリーの右側のノードを見つけるプログラム

    バイナリツリーが提供されているとします。また、ノード(「u」という名前)へのポインターが与えられ、提供されたノードのすぐ右にあるノードを見つける必要があります。特定のノードの右側にあるノードは同じレベルにとどまる必要があり、特定のノードはリーフノードまたは内部ノードのいずれかになります。 したがって、入力が次のような場合 u =6の場合、出力は8になります。 ノード6の右側にあるノードはノード8であるため、値8が返されます。 これを解決するには、次の手順に従います- ルートが空の場合、 nullを返す dq:=新しい両端キュー dqの最後にルートを挿入

  2. Pythonを使用してすべてのノードに到達するための頂点の最小数を見つけるプログラム

    n個の頂点とノードに0からn-1までの番号が付けられた有向非巡回グラフがあるとします。グラフはエッジリストで表されます。ここで、edges [i] =(u、v)はノードuからノードv。グラフ内のすべてのノードに到達できる頂点の最小セットを見つける必要があります。 (頂点は任意の順序で返すことができます)。 したがって、入力が次のような場合 これらの2つの頂点は他のどの頂点からも到達できないため、出力は[0,2,3]になります。したがって、それらから開始すると、すべてをカバーできます。 これを解決するには、次の手順に従います- n:=エッジのサイズ all_nodes:=