Pythonで島間の最短橋の距離を見つけるプログラム
バイナリ行列があるとします。ここで、0は水を表し、1は土地を表します。島は、4つの方向に1を接続するグループです。島は0(水)またはエッジに囲まれています。 2つの島を結ぶ最短の橋の長さを見つける必要があります。
したがって、入力が次のような場合
0 | 0 | 1 |
1 | 0 | 1 |
1 | 0 | 0 |
その場合、出力は1になります。これにより、(1,0)ポイントが(1,2)ポイントに接続されます。
これを解決するには、次の手順に従います-
-
行:=行列の行数
-
col:=行列の列数
-
関数dfs()を定義します。これにはi、j、sが必要です
-
(i、j)がsの場合、
-
戻る
-
-
mat [i、j]が0と同じ場合、
-
戻る
-
-
(i、j)をsに挿入します
-
i-1> =0の場合、
-
dfs(i-1、j、s)
-
-
i + 1 <行の場合、
-
dfs(i + 1、j、s)
-
-
j-1> =0の場合、
-
dfs(i、j-1、s)
-
-
j + 1
-
dfs(i、j + 1、s)
-
-
メインの方法から、次のようにします-
-
見た:=新しいセット
-
0から行までの範囲のiの場合、実行
-
見たサイズが0より大きい場合、
-
ループから出てきます
-
-
0からcolの範囲のjについては、次のようにします
-
mat [i、j]が1と同じ場合、
-
dfs(i、j、見た)
-
ループから出てきます
-
-
-
-
q:=両端キュー
-
見られる土地ごとに、実行します
-
(i、j):=土地
-
i --1> =0で、mat [i --1、j]が0と同じ場合、
-
qの最後に(i-1、j、1)を挿入します
-
-
i +1<行およびmat[i+ 1、j]が0と同じである場合、
-
qの最後に(i + 1、j、1)を挿入します
-
-
j --1> =0で、mat [i、j --1]が0と同じ場合、
-
qの最後に(i、j --1、1)を挿入します
-
-
j + 1
-
qの最後に(i、j + 1、1)を挿入します
-
-
-
q> 0のサイズで、実行
-
(i、j、dist):=qの左側のアイテム、およびqの左側からアイテムを削除
-
(i、j)が見られる場合、
-
次のイテレーションに行く
-
-
見たとおりに(i、j)をマーク
-
mat [i、j]が1と同じ場合、
-
return dist-1
-
-
i-1> =0の場合、
-
qの最後に(i-1、j、dist + 1)を挿入します
-
-
i + 1 <行がゼロ以外の場合、
-
qの最後に(i + 1、j、dist + 1)を挿入します
-
-
j-1> =0の場合、
-
qの最後に(i、j-1、dist + 1)を挿入します
-
-
j + 1
-
qの最後に(i、j + 1、dist + 1)を挿入します
-
-
例
理解を深めるために、次の実装を見てみましょう-
import collections class Solution: def solve(self, mat): row = len(mat) col = len(mat[0]) def dfs(i, j, s): if (i, j) in s: return if mat[i][j] == 0: return s.add((i, j)) if i - 1 >= 0: dfs(i - 1, j, s) if i + 1 < row: dfs(i + 1, j, s) if j - 1 >= 0: dfs(i, j - 1, s) if j + 1 < col: dfs(i, j + 1, s) seen = set() for i in range(row): if len(seen) > 0: break for j in range(col): if mat[i][j] == 1: dfs(i, j, seen) break q = collections.deque() for land in seen: i, j = land if i - 1 >= 0 and mat[i - 1][j] == 0: q.append((i - 1, j, 1)) if i + 1 < row and mat[i + 1][j] == 0: q.append((i + 1, j, 1)) if j - 1 >= 0 and mat[i][j - 1] == 0: q.append((i, j - 1, 1)) if j + 1 < col and mat[i][j + 1] == 0: q.append((i, j + 1, 1)) while len(q) > 0: i, j, dist = q.popleft() if (i, j) in seen: continue seen.add((i, j)) if mat[i][j] == 1: return dist - 1 if i - 1 >= 0: q.append((i - 1, j, dist + 1)) if i + 1 < row: q.append((i + 1, j, dist + 1)) if j - 1 >= 0: q.append((i, j - 1, dist + 1)) if j + 1 < col: q.append((i, j + 1, dist + 1)) ob = Solution() matrix = [ [0, 0, 1], [1, 0, 1], [1, 0, 0], ] print(ob.solve(matrix))
入力
[ [0, 0, 1], [1, 0, 1], [1, 0, 0], ]
出力
1
-
Pythonでターゲットを保持している最短のサイクル長を見つけるプログラム
有向グラフの隣接リストがあるとします。ここで、インデックスiの各リストは、ノードiからの接続されたノードで表されます。目標値もあります。ターゲットを含む最短サイクルの長さを見つける必要があります。解決策がない場合は-1を返します。 したがって、入力が次のような場合 0があることに注意してください。ただし、これは最短ではありません。 これを解決するには、次の手順に従います- 訪問:=新しいセット l:=要素ターゲットのリスト。 長さ:=0 lが空ではない場合は、 長さ:=長さ+ 1 nl:=新しいリスト lの各uについて、 グラフ[u]の各vについて、 vがターゲット
-
Pythonでノードと子孫の違いを見つけるプログラム
二分木があるとすると、ノードとその子孫の間で最大の絶対差を見つける必要があります。 したがって、入力が次のような場合 その場合、最大の絶対差はノード8と1の間であるため、出力は7になります。 これを解決するには、次の手順に従います- 関数dfs()を定義します。これはノードを取ります ノードがnullでない場合、 正と負の無限大のリストを返す left:=dfs(ノードの左側) right:=dfs(ノードの右) res:=(left [0]、right [0]の最小値とノードの値、およびleft [1]、right [1]とノードの値の最大値)とのペア ans: