Pythonの蛇と梯子ゲームの最小の動きを見つけるためのプログラム
蛇と梯子のゲームをしているとしましょう。サイコロを振って好きな数だけ振ることができるという条件があります。位置0から開始し、目的地は位置100で、サイコロを数回転がして目的地に到達します。ボード上の蛇と梯子の位置が提供されている場合、目的地に到達するために必要なダイスロールの最小数を見つける必要があります。蛇と梯子の配列は、ボード内の蛇と梯子の位置を表し、配列には、ボード上の蛇または梯子の開始値と終了値が含まれています。
したがって、入力がラダー=[(11、40)、(37,67)、(47、73)、(15、72)]のようである場合、ヘビ=[(90、12)、(98、31)、 (85、23)、(75、42)、(70、18)、(49、47)]の場合、出力は8になります。
蛇と梯子の位置を考えると、ボード上の100番目の位置に到達するために必要な最小移動回数は8回です。
これを解決するには、次の手順に従います-
- アレイスネークをアレイラダーに追加します
- edges:=新しいマップ
- はしごの各ペアf、tについて、
- edges [f]:=t
- u:=新しいセット
- v:=新しいセット
- vに(1)を追加
- m:=0
- vには100が存在しませんが、
- m:=m + 1
- w:=新しいセット
- vのfごとに、
- 1から6の範囲のiについては、
- n:=f + i
- nがエッジに存在する場合、
- n:=エッジ[n]
- nがuに存在する場合、
- 次の反復に進む
- uに(n)を追加
- wに(n)を追加
- 1から6の範囲のiについては、
- v:=w
- return m
例
理解を深めるために、次の実装を見てみましょう-
def solve(ladders, snakes): ladders.extend(snakes) edges = {} for f,t in ladders: edges[f] = t u = set() v = set() v.add(1) m = 0 while 100 not in v: m += 1 w = set() for f in v: for i in range(1,7): n = f + i if n in edges: n = edges[n] if n in u: continue u.add(n) w.add(n) v = w return m print(solve([(11, 40), (37,67),(47, 73),(15, 72)], [(90, 12), (98, 31), (85, 23), (75, 42), (70, 18), (49, 47)]))
入力
[(11, 40), (37,67),(47, 73),(15, 72)], [(90, 12), (98, 31), (85, 23), (75, 42), (70, 18), (49, 47)]
出力
8
-
Pythonのグラフでクリティカルエッジと疑似クリティカルエッジを見つけるプログラム
0からn-1までの番号が付けられたn個の頂点を含むグラフが与えられたとします。グラフは無向であり、各エッジには重みがあります。したがって、グラフが与えられた場合、グラフMSTのクリティカルエッジと疑似クリティカルエッジを見つける必要があります。エッジを削除するとMSTの重みが増加する場合、そのエッジはクリティカルエッジと呼ばれます。疑似クリティカルエッジは、すべてではなく、すべてのグラフMSTに表示できるエッジです。グラフを入力として与えられたエッジのインデックスを見つけます。 したがって、入力が次のような場合 頂点の数が5の場合、出力は[[]、[0、1、2、3、4]]になります。指
-
チェスの駒が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個の整数が