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

BankinPythonで警備員からの最短距離を見つける


3文字の「O」、「G」、「W」で満たされたマトリックスがあるとします。ここで、「O」はオープンスペースを表し、「G」は警備員を表し、 「W」は銀行の壁を表しています。1つのガードからの最短距離に関して、マトリックス内のすべてのOを置き換える必要があります。壁を通過することはできません。出力マトリックスでは、ガードは0に置き換えられ、壁は-1に置き換えられます。

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

O O O O G
O O O W O
O W O O O
G W W W O
O O O O G
出力は

になります
3 3 2 1 0
2 3 3 -1 1
1 -1 4 3 2
0 -1 -1 -1 1
1 2 2 1 0

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

  • M:=5

  • N:=5

  • dir_row:=[-1、0、1、0]

  • dir_col:=[0、1、0、-1]

  • 関数is_ok()を定義します。これにはi、jが必要です

  • (iが範囲0およびM)または(jが範囲0およびj N)の場合、

    • Falseを返す

  • Trueを返す

  • 関数isSafe()を定義します。これには、i、j、matrix、resultが必要です

  • matrix [i、j]が'O'でない場合、またはresult [i、j]が-1でない場合、

    • Falseを返す

  • Trueを返す

  • 関数calculate_dist()を定義します。これは行列を取ります

  • 結果:=次数M x Nの行列を作成し、-1で埋めます

  • 両端キューを定義するq

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

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

      • result [i、j]:=-1

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

        • pos:=[i、j、0]

        • qの左側にposを挿入します

        • result [i、j]:=0

  • q> 0のサイズがゼロ以外の場合、実行

    • curr:=qから最後の要素を削除

    • x、y、dist:=curr [0]、curr [1]、curr [2]

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

      • is_ok(x + dir_row [i]、y + dir_col [i])がゼロ以外であり、isSafe(x + dir_row [i]、y + dir_col [i]、matrix、result)がゼロ以外の場合、

        • result [x + dir_row [i]、y + dir_col [i]]:=dist + 1

        • pos:=[x + dir_row [i]、y + dir_col [i]、dist + 1]

        • qの左側にposを挿入します

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

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

      • 結果の表示[i、j]

    • 次の行に移動

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

from collections import deque as queue
M = 5
N = 5
dir_row = [-1, 0, 1, 0]
dir_col = [0, 1, 0, -1]
def is_ok(i, j):
   if ((i < 0 or i > M - 1) or (j < 0 or j > N - 1)):
      return False
   return True
def isSafe(i, j,matrix, result):
   if (matrix[i][j] != 'O' or result[i][j] != -1):
      return False
   return True
def calculate_dist(matrix):
   result = [[ -1 for i in range(N)]for i in range(M)]
   q = queue()
   for i in range(M):
      for j in range(N):
         result[i][j] = -1
         if (matrix[i][j] == 'G'):
            pos = [i, j, 0]
            q.appendleft(pos)
            result[i][j] = 0
   while (len(q) > 0):
      curr = q.pop()
      x, y, dist = curr[0], curr[1], curr[2]
   for i in range(4):
      if is_ok(x + dir_row[i], y + dir_col[i]) and isSafe(x + dir_row[i], y + dir_col[i], matrix, result) : result[x + dir_row[i]][y + dir_col[i]] = dist + 1
      pos = [x + dir_row[i], y + dir_col[i], dist + 1]
      q.appendleft(pos)
   for i in range(M):
      for j in range(N):
         if result[i][j] > 0:
            print(result[i][j], end=" ")
         else:
            print(result[i][j],end=" ")
      print()

matrix = [['O', 'O', 'O', 'O', 'G'],
   ['O', 'O', 'O', 'W', 'O'],
   ['O', 'W', 'O', 'O', 'O'],
   ['G', 'W', 'W', 'W', 'O'],
   ['O', 'O', 'O', 'O', 'G']]

calculate_dist(matrix)

入力

[['O', 'O', 'O', 'O', 'G'],
['O', 'O', 'O', 'W', 'O'],
['O', 'W', 'O', 'O', 'O'],
['G', 'W', 'W', 'W', 'O'],
['O', 'O', 'O', 'O', 'G']]

出力

3 3 2 1 0
2 3 3 -1 1
1 -1 4 3 2
0 -1 -1 -1 1
1 2 2 1 0

  1. Pythonでターゲットを保持している最短のサイクル長を見つけるプログラム

    有向グラフの隣接リストがあるとします。ここで、インデックスiの各リストは、ノードiからの接続されたノードで表されます。目標値もあります。ターゲットを含む最短サイクルの長さを見つける必要があります。解決策がない場合は-1を返します。 したがって、入力が次のような場合 0があることに注意してください。ただし、これは最短ではありません。 これを解決するには、次の手順に従います- 訪問:=新しいセット l:=要素ターゲットのリスト。 長さ:=0 lが空ではない場合は、 長さ:=長さ+ 1 nl:=新しいリスト lの各uについて、 グラフ[u]の各vについて、 vがターゲット

  2. リストからN個の最大の要素を見つけるPythonプログラム

    整数リストが与えられた場合、私たちのタスクはリスト内で最大のN個の要素を見つけることです。 例 Input : [40, 5, 10, 20, 9] N = 2 Output: [40, 20] アルゴリズム Step1: Input an integer list and the number of largest number. Step2: First traverse the list up to N times. Step3: Each traverse find the largest value and store it in a new list. 例 def Nnumbere