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

Pythonで行列の1つのセルから別のセルに移動するために必要な最小移動数を見つけます


1つのNXN行列Mがあり、これが1、0、2、3で満たされているとします。ソースセルから宛先セルに移動するために必要な最小移動数を見つける必要があります。 。空白のセルからのみアクセスしている間は、上、下、右、左にアクセスできます。

  • 値1のセルはソースを示します。

  • 値2のセルは、宛先を示します。

  • 値3のセルは、空白のセルを示します。

  • 値が0のセルは、空白の壁を示します。

ソースセルと宛先セルは1つだけです。ソースセルから宛先に到達するためのパスが複数ある場合があります。ここで、マトリックス内の各移動は「1」と見なされます。

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

3 3 1 0
3 0 3 3
3 3 0 3
0 3 2 3

その場合、出力は5になります

3 3 1 0
3 0 3 3
3 3 0 3
0 3 2 3
出発地から目的地までの緑の道は最短です。

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

  • ノード:=注文*注文+ 2

  • g:=「ノード」数の頂点を持つ空白のグラフ

  • k:=1

  • 注文する範囲0のiについては、実行してください

    • 注文する範囲0のjについては、次のようにします

      • mat [i、j]が0と同じでない場合、

        • is_ok(i、j + 1、mat)がゼロ以外の場合、

          • kとk+1ノードの間にエッジを作成します

        • is_ok(i、j --1、mat)がゼロ以外の場合、

          • k、k-1ノードの間にエッジを作成します

        • j

          • k、k+gの次数ノードの間にエッジを作成します

        • i> 0で、is_ok(i --1、j、mat)がゼロ以外の場合、

          • k、kの間にエッジを作成します-gの次数ノード

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

        • src:=k

      • mat [i、j]が2と同じ場合、

        • dest:=k

      • k:=k + 1

  • srcからgのdestにbfsを実行する

    を返す

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

class Graph:
   def __init__(self, nodes):
      self.nodes = nodes
      self.adj = [[] for i in range(nodes)]
   def insert_edge (self, src , dest):
      self.adj[src].append(dest)
      self.adj[dest].append(src)
   def BFS(self, src, dest):
      if (src == dest):
         return 0
      level = [-1] * self.nodes
      queue = []
      level[src] = 0
      queue.append(src)
      while (len(queue) != 0):
         src = queue.pop()
            i = 0
            while i < len(self.adj[src]):
               if (level[self.adj[src][i]] < 0 or level[self.adj[src][i]] > level[src] + 1 ):
level[self.adj[src][i]] = level[src] + 1 queue.append(self.adj[src][i])
               i += 1
      return level[dest]

def is_ok(i, j, mat):
   global order
   if ((i < 0 or i >= order) or (j < 0 or j >= order ) or mat[i][j] == 0):
      return False
   return True
def get_min_math(mat):
   global order
   src , dest = None, None
   nodes = order * order + 2
   g = Graph(nodes)
   k = 1
   for i in range(order):
      for j in range(order):
         if (mat[i][j] != 0):
            if (is_ok (i , j + 1 , mat)):
               g.insert_edge (k , k + 1)
            if (is_ok (i , j - 1 , mat)):
               g.insert_edge (k , k - 1)
            if (j < order - 1 and is_ok (i + 1 , j , mat)):
               g.insert_edge (k , k + order)
            if (i > 0 and is_ok (i - 1 , j , mat)):
               g.insert_edge (k , k - order)
         if(mat[i][j] == 1):
            src = k
         if (mat[i][j] == 2):
            dest = k
         k += 1
   return g.BFS (src, dest)
order = 4
mat = [[3,3,1,0], [3,0,3,3], [3,3,0,3], [0,3,2,3]]
print(get_min_math(mat))

入力

[[3,3,1,0], [3,0,3,3], [3,3,0,3], [0,3,2,3]]

出力

0

  1. チェスの駒がPythonのすべての位置に到達するための最小移動数を見つけるためのプログラム

    チェス盤と、ボード内でL字型に動く特別な騎士の駒Kがあるとします。ピースが(x1、y1)の位置にあり、(x2、y2)に移動する場合、その移動はx2=x1±a;として記述できます。 y2=y1±bまたはx2=x1±b; y2=y1±a;ここで、aとbは整数です。位置(0、0)からチェス盤の位置(n-1、n-1)に到達するために、そのチェスの駒が到達するための最小移動数を見つける必要があります。位置に到達できない場合は-1とマークされ、到達できない場合は移動数が返されます。 n – 1行の出力を出力します。ここで、各行iには、ピースが各jに対して実行する必要のある最小移動数を表すn −1個の整数が

  2. 行列の転置を見つけるPythonプログラム

    この記事では、特定の問題ステートメントを解決するための解決策とアプローチについて学習します。 問題の説明 行列が与えられた場合、転置を同じ行列に格納して表示する必要があります。 行列の転置は、行を列に、列を行に変更することで得られます。つまり、A行列の転置はA[i][j]をA[j][i]に変更することで得られます。 以下に示す実装を見てみましょう- 例 N = 4 def transpose(A):    for i in range(N):       for j in range(i+1, N):     &nbs