Pythonで迷路行列をエスケープするための最小移動数
バイナリ行列があるとします。ここで、0は空のセルを表し、1は壁を表します。左上隅(0、0)から開始する場合、右下隅に到達するために必要なセルの最小数を見つける必要があります(R-1、C-1)。ここで、Rは行数、Cは数です。列の。答えが見つからない場合は、-1を返します。
したがって、入力が次のような場合
0 | 0 | 0 | 1 | 0 |
0 | 0 | 1 | 1 | 0 |
0 | 0 | 0 | 1 | 1 |
1 | 1 | 0 | 0 | 0 |
-
のようなパスを選択できるため、出力は8になります。0 | 0 | 0 | 1 | 0 |
0 | 0 | 1 | 1 | 0 |
0 | 0 | 0 | 1 | 1 |
1 | 1 | 0 | 0 | 0 |
これを解決するには、次の手順に従います-
- R:=行数
- C:=列数
- q:=空のリスト、matrix [0、0]が0の場合、最初に(0、0、1)を挿入します
- matrix [0、0]:=1
- qの各トリプレット(r、c、d)について、
- (r、c)が(R-1、C-1)と同じ場合、
- return d
- [(r + 1、c)、(r --1、c)、(r、c + 1)、(r、c -1)]のx、yごとに、do
- 0 <=x
- matrix [x、y]:=1
- qの最後にトリプレット(x、y、d + 1)を挿入します
- 0 <=x
- (r、c)が(R-1、C-1)と同じ場合、
例
理解を深めるために、次の実装を見てみましょう-
def solve(matrix): R, C = len(matrix), len(matrix[0]) q = [(0, 0, 1)] if not matrix[0][0] else [] matrix[0][0] = 1 for r, c, d in q: if (r, c) == (R - 1, C - 1): return d for x, y in [(r + 1, c), (r - 1, c), (r, c + 1), (r, c - 1)]: if 0 <= x < R and 0 <= y < C and matrix[x][y] == 0: matrix[x][y] = 1 q.append((x, y, d + 1)) return -1 matrix = [ [0, 0, 0, 1, 0], [0, 0, 1, 1, 0], [0, 0, 0, 1, 1], [1, 1, 0, 0, 0] ] print(solve(matrix))
入力
[ [0, 0, 0, 1, 0], [0, 0, 1, 1, 0], [0, 0, 0, 1, 1], [1, 1, 0, 0, 0] ]
出力
8
-
チェスの駒が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個の整数が
-
Pythonで行列内の囲まれた島の数を数えるプログラム
バイナリ行列があるとします。ここで、1は土地を表し、0は水を表します。私たちが知っているように、島は周囲が水に囲まれているグループ化された1のグループです。完全に囲まれた島の数を見つける必要があります。 したがって、入力が次のような場合 3つの島があるため、出力は2になりますが、そのうちの2つは完全に囲まれています。 これを解決するには、次の手順に従います- 関数dfs()を定義します。これにはi、jが必要です iとjが行列の範囲内にない場合、 Falseを返す matrix [i、j]が0と同じ場合、 Trueを返す matrix [i、j]:=0 a:=df