グラップリングフックで木々の間をスイング
森の中の小道を見つけたので、森に沿って旅行する予定です。しかし、あなたが旅を始める直前に、地面は溶岩に変わります。 あなたはなんとか最も近い木を急いでなんとかします(どうしても木は燃えませんでした)。答えは、プログラミングの課題にぴったりだと思います。魔法のグラップリングフック(先にカヌーで作ったもの)を使って、木や枝を振り回すことができます。 ただし、そこにたどり着くためにどの木や枝を振り回す必要があるかはわかりません。幸い、あなたにはプログラミングのスキルがあるので、腕にプログラムを描き、どの木にスイングするかを教えることにしました。ただし、腕には表面積があまりないため、プログラムをできるだけ小さくする必要があります。 nby m配列を使用してフォレストを表すことができます。次の文字が配列を構成します。 T:木。ここに着陸できます。これにはグラップリングフックを使用できません。あなたはこれを通り抜けることができます。 P:と同じように機能しTます。ここから始めます。 Q:と同じように機能しTます。これが目標です。 +:ブランチ。ここに着陸することはできません。これでグラップリングフックを使用できます。あなたはこれを通り抜けることができます。 *:人食いクモ。ここに着陸すると死ぬ。これでグラップリングフックを使うと死ぬ。これを振り回すと死にます。 -:通常の地面、言い換えれば溶岩。ここに着陸することはできません。これにはグラップリングフックを使用できません。あなたはこれを通り抜けることができます。指定された配列の外側のすべての領域がこのタイプです。 以下は、森がどのように見えるかの例です。 y ----T---+------12 ---------------11 ----T---+---T--10 ---------------9 T-+-T-+-T------8 ---------------7 ------------+--6 ----+----------5 +-------+------4 ---------------3 ----P---+-*-Q--2 ---------------1 T-+-T-+-T------0 012345678911111 x 01234 (x,y)座標軸に示されているように、座標をと表記します。 あなたはから始めてP、あなたの方法を作らなければなりませんQ。これを行うには、ブランチを使用Tしてツリーからツリーにスイングします。グラップリングフックは、直交するブランチ(つまり、現在のx位置またはy位置と同じブランチ)に取り付けることができます。たとえば、サンプルのフォレストの位置にいる場合は、グラップリングフックを、、またはの位置に取り付けることができます。あなたと枝の間に木や他の枝があったとしてもこれを付けることができます。T+(4,8)(2,8)(6,8)(4,5) グラップリングフックを枝に取り付けたら、最初の位置と枝の間の距離の2倍に等しい距離を枝の方向に移動します。言い換えると、最終位置は、ブランチから開始位置と同じ距離で、ちょうど反対側になります。運動がどのように機能するかについてのより正式な定義は以下のとおりです。の添え字vは、最終位置、u初期位置、およびb分岐の位置です。 (xv、yv)= (2 xb− xあなた、2 Yb− yあなた)(バツv、yv)=(2バツb−バツあなた、2yb−yあなた)(x_v, y_v) = (2x_b-x_u, 2y_b-y_u) 最初の位置と最後の位置の間にクモがいる場合は、そこに移動できないことに注意してください。たとえば、サンプルフォレストでは、からスパイダーにぶつかるため、から(4,2)へのスイング(12,2)はできません(10,2)。 目標は、このスウィングスルーブランチ法を使用して、可能な限り少ないスイングでポイントPからポイントに移動することです。たとえば、フォレストの例では、最短パスは次のとおりです。Q 以下から(4,2)の(4,8)使用(4,5) 以下から(4,8)の(0,8)使用(2,8) 以下から(0,8)の(0,0)使用(0,4) 以下から(0,0)の(4,0)使用(2,0) 以下から(4,0)の(4,10)使用(4,5) 以下から(4,10)の(12,10)使用(8,10) …