車輪のシステムで作られたロックを考えてみましょう。各ホイールには順番に 26 文字のアルファベットがあり、各ホイールは で初期化されてい'a'
ます。ホイールを 1 つ上に動かすと、そのホイールの表示はアルファベットの次の文字に移動します。一方、ホイールを下に動かすと、表示がアルファベットの前の文字に切り替わります。例えば:
['a'] -> UP -> ['b']
['b'] -> DOWN -> ['a']
...
['z'] -> UP -> ['a']
['a'] -> DOWN -> ['z']
フリックするだけで、隣接するホイールのサブシーケンスを同じ方向に移動できます。これは、サブシーケンスのすべてのホイールを 1 回のモーションでそのように動かすのと同じ効果があります。たとえば、ターゲット ストリングが の場合、'zzzzzzzzz'
に変更する 1 つの動きは、一連のホイール全体を から に変更し'a'
、ターゲット ストリングに到達してロックを開きます。'z'
'a'
'z'
ロックを開くための最小移動回数を決定するにはどうすればよいですか? この問題の動的な解決策はありますか? アルゴリズムは、次の結果を生成する必要があります。
Target string | # moves
______________________________ __________
1 | abcxyz | 5
2 | abcdefghijklmnopqrstuvwxyz | 25
3 | aaaaaaaaa | 0
4 | zzzzzzzzz | 1
5 | zzzzbzzzz | 3
ケース 1、ターゲットabcxyz
:
aaa[aaa] -> DOWN -> aaazzz
aaa[zz]z -> DOWN -> aaayyz
aaa[y]yz -> DOWN -> aaaxyz
a[aa]xyz -> UP -> abbxyz
ab[b]xyz -> UP -> abcxyz
ケース 5、ターゲットzzzzbzzzz
:
[aaaaaaaaa] -> DOWN -> zzzzzzzzz
zzzz[z]zzzz -> UP -> zzzzazzzz
zzzz[a]zzzz -> UP -> zzzzbzzzz