ボールの動きを徹底的にトレースすることは、プログラムするのが最も簡単であり、効率の観点からも悪くありません。以前に見られたボールのすべての状態のハッシュテーブルを保持する必要があります(ボールの状態は、それが置かれているグリッドの正方形であり、どの方向に向かっているか); 過去の状態を繰り返すことがわかった場合は、それが永久にループし、動きの追跡をこれ以上停止することができます。この方法では、ボールの動きをトレースするのに最大でO(mn) 最悪の場合の時間。
これは、少し単純な代数を使用して「現在の状態を考えると、ボールが次にヒットする壁は何ですか」を計算することでスピードアップできます。にO(1) 時間-それは速くなりますが、簡単ではありません。
数論と、グリッドを無限に拡張するTom Van der Zandenの手法に基づいた、よりエレガントで効率的なソリューションがあります。
ボールが無限のグリッドで直線的に移動する平行宇宙を想像してください。トムが言うように、私たちの宇宙の壁を跳ね返ることは、平行宇宙で直線を続けることと同じです。これが私たちが使用する最初の洞察です。
この洞察の意味を理解しましょう。私たちの宇宙では、ボールはある初期座標で始まります(x0,y0)、NEを移動し、座標に到達するかどうかを知りたい (x′,y′)。これは無限の宇宙で何を意味しますか?さて、地雷を座標に配置することを想像してください(x′,y′)、 (x′,2n−y′)、 (x′,y′+2n)、 (x′,4n−y′)、...、 (2m−x′,y′)、 (2m−x′,2n−y′)、...-特に座標で (2im±x′,2jn±y′) どこ i,jすべての整数の範囲。その後、ボールは最終的に座標に到達すると主張します(x′,y′)宇宙でボールが最終的に地雷に当たる場合に限ります。ですから、私たちの問題は、次のように質問することになります。平行宇宙では、ボールが地雷に当たることはありますか?
2番目の洞察は、その理論に答えるために数論を使用できるということです。特に、後t 時間の単位、ボールは位置にあります (x0+t,y0+t)平行宇宙で。整数が存在するかどうかを知りたいt,i,j そのような x0+t=2im±x′ そして y0+t=2jn±y′。これらの方程式を並べ替え、モジュラー演算の言語を使用して、整数が存在するかどうかを尋ねていますt 次の式の両方が成り立つように:
tt≡±x′−x0(mod2m),≡±y′−y0(mod2n).
これで、数論を適用する準備が整いました。特に、これは中国の剰余定理を適用するために完全に設定されています。定義するg=2gcd(m,n)。次に、上記の連立方程式は、次の場合にのみ整数の解を持ちます。
±x′−x0≡±y′−y0(modg).
つまり、次の4つの条件を確認する必要があります。
- x′−x0≡y′−y0(modg)
- −x′−x0≡y′−y0(modg)
- x′−x0≡−y′−y0(modg)
- −x′−x0≡−y′−y0(modg)
これらの4つの条件のいずれかが成立する場合、上記の連立方程式の解が存在するため、平行宇宙ではボールが地雷に当たります。これら4つの条件のいずれにも当てはまらない場合は、ボールが地雷に当たることはありません。(これらの4つの条件は、ボールが最初にNEを移動する場合の関連条件です。他の方向は、同様の4つの条件のセットで対称的に処理できます。)
元の問題を言い換えると、簡単に実装して実行できる元の問題の解決策が得られます O(1)時間。計算しますg=2gcd(m,n)上記の箇条書きの4つの条件を確認してください。4つの条件のいずれかに当てはまる場合、答えは「はい」です。ボールは最終的にポイントに到達します(x′,y′)。4つの条件のいずれにも当てはまらない場合、答えは「いいえ」です。ボールはポイントに到達しません。(x′,y′)。