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

Pythonで最小限の労力でパスを見つけるプログラム


高さと呼ばれる次数mxnの2D行列があるとします。 heights [i] [j]は、セル(i、j)の高さを表します。 (0、0)セルにいる場合は、右下のセル(m-1、n-1)に移動します。上、下、左、右に移動でき、最小限の労力でルートを見つけたいと考えています。この問題では、ルートの努力は、ルートの2つの連続するセル間の高さの最大絶対差です。最後に、目的地までの移動に必要な最小限の労力を見つける必要があります。

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

2 3 4
4 9 5
6 4 6

ルートが[2,3,4,5,6]であるため、出力は1になります。連続するセルでは、最大絶対差が1になります。

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

  • r:=高さの行数、c:=高さの列数
  • queue:=キューは最初にタプル(0,0,0)を格納します
  • キューが空でないときに、実行します
    • cur:=キューの最初のアイテムで、キューから削除します
    • c_eff:=cur [0]
    • x:=cur [1]
    • y:=cur [2]
    • xがr-1と同じで、yがc-1と同じ場合、
      • return c_eff
    • heights [x、y]が空白の文字列の場合、
      • 次の反復に進む
    • [[1,0]、[-1,0]、[0,1]、[0、-1]]の各dx、dyについて、実行
      • newx:=x + dx
      • newy:=y + dy
      • 0 <=newx
      • eff:=c_effと|heights [newx、newy]の最大値-heights [x、y] |
      • タプル(eff、newx、newy)をキューに挿入します
  • heights [x、y]:=空白の文字列

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

import heapq
def solve(heights):
   r,c=len(heights),len(heights[0])
   queue=[(0,0,0)]

   while queue:

      cur=heapq.heappop(queue)
      c_eff=cur[0]
      x=cur[1]
      y=cur[2]

      if x==r-1 and y==c-1:
         return c_eff

      if heights[x][y]=="":
         continue

      for dx,dy in [[1,0],[-1,0],[0,1],[0,-1]]:
         newx=x+dx
         newy=y+dy
         if 0<=newx<r and 0<=newy<c and heights[newx][newy]!="":

            eff = max(c_eff, abs(heights[newx][newy] - heights[x][y]))
            heapq.heappush(queue,(eff, newx, newy))

      heights[x][y]=""

matrix = [[2,3,4],[4,9,5],[6,4,6]]
print(solve(matrix))

入力

[[2,3,4],[4,9,5],[6,4,6]]

出力

1

  1. Pythonを使用して最大の確率でパスを見つけるプログラム

    n個のノード(ノードには0から番号が付けられます)を持つ無向加重グラフがあるとします。このグラフは、エッジリストを使用して入力として与えられ、各エッジeについて、そのエッジ確率[e]を通過する成功の確率があります。開始ノードと終了ノードもあります。最初から最後まで成功の確率が最大のパスを見つけて、成功の確率を返す必要があります。パスが見つからない場合は、0を返します。 したがって、入力が次のような場合 ノード0から2へのパスが2つあるため、出力は0.24になります。1つは確率0.2、もう1つはノード1を経由するパスの確率は0.4 * 0.6 =0.24で、これが最大です。 これを解

  2. Pythonで最小値が最大のパス

    R行とC列の整数の行列Aがあるとすると、[0,0]で始まり[R-1、C-1]で終わるパスの最大スコアを見つける必要があります。ここで、スコアリング手法はそのパスの最小値になります。たとえば、パス8→4→5→9の値は4です。パスは、4つの主要な方向(北、東、西、南)のいずれかで、1つの訪問済みセルから隣接する未訪問セルに数回移動します。 。 たとえば、グリッドが-のような場合 5 4 5 1 2 6 7 4 6 オレンジ色のセルがパスになります。出力は4です これを解決するには、次の手順に従います- r:=行数およびc:=列数