大きな迷路のPythonを脱出する
グリッドがあり、100万行と100万列があり、ブロックされたセルのリストも1つあるとします。次に、ソーススクエアから開始し、ターゲットスクエアに到達します。それぞれの動きで、ブロックされたセルの指定されたリストにないグリッド内の上下左右に隣接する正方形まで歩くことができます。
一連の移動で目標のマスに到達できるかどうかを確認する必要があります。
したがって、入力がblocked =[[0,1]、[1,0]]、source =[0,0]、target =[0,3]のような場合、出力はFalseになります
これを解決するには、次の手順に従います-
-
ブロックされた:=すべてのブロックされたセルのセットを作成する
-
1つのメソッドdfs()を定義します。これは、x、y、targetを取り、表示されます
-
(x、y)がグリッドの範囲内にないか、(x、y)がブロックされているか、(x、y)が表示されている場合、
-
falseを返す
-
-
-
(x、y)をseenに追加
-
見たサイズ>20000または(x、y)がターゲットの場合、
-
trueを返す
-
-
dfs(x + 1、y、target、seen)またはdfs(x-1、y、target、seen)またはdfs(x、y + 1、target、seen)またはdfs(x、y-1、target、見た)
-
dfs(source [0]、source [1]、target、empty set)およびdfs(target [0]、target [1]、source、empty set)を返す
理解を深めるために、次の実装を見てみましょう-
例
class Solution(object): def isEscapePossible(self, blocked, source, target): blocked = set(map(tuple, blocked)) def dfs(x, y, target, seen): if not (0 <= x < 10**6 and 0 <= y < 10**6) or (x, y) in blocked or (x, y) in seen: return False seen.add((x, y)) if len(seen) > 20000 or [x, y] == target: return True return dfs(x + 1, y, target, seen) or \ dfs(x - 1, y, target, seen) or \ dfs(x, y + 1, target, seen) or \ dfs(x, y - 1, target, seen) return dfs(source[0], source[1], target, set()) and dfs(target[0], target[1], source, set()) ob = Solution() print(ob.isEscapePossible([[0,1],[1,0]], [0,0], [0,3]))
入力
[[0,1],[1,0]], [0,0], [0,3]
出力
False
-
Pythonでターゲットを保持している最短のサイクル長を見つけるプログラム
有向グラフの隣接リストがあるとします。ここで、インデックスiの各リストは、ノードiからの接続されたノードで表されます。目標値もあります。ターゲットを含む最短サイクルの長さを見つける必要があります。解決策がない場合は-1を返します。 したがって、入力が次のような場合 0があることに注意してください。ただし、これは最短ではありません。 これを解決するには、次の手順に従います- 訪問:=新しいセット l:=要素ターゲットのリスト。 長さ:=0 lが空ではない場合は、 長さ:=長さ+ 1 nl:=新しいリスト lの各uについて、 グラフ[u]の各vについて、 vがターゲット
-
Pythonで文字列のエスケープシーケンスを処理する方法は?
Pythonでバックスラッシュでエスケープされた文字列をエスケープ解除するには、2つの方法があります。 1つは、literal_evalを使用して文字列を評価することです。この方法では、文字列を別の引用符で囲む必要があることに注意してください。例: >>> import ast >>> a = '"Hello,\\nworld"' >>> print ast.literal_eval(a) Hello, world もう1つの方法は、文字列クラスのdecode(string_escape)メソッドを使用