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