Das vollständige Verfolgen der Bewegung des Balls ist am einfachsten zu programmieren und aus Effizienzgründen auch nicht schlecht. Sie sollten eine Hash-Tabelle aller zuvor gesehenen Zustände des Balls führen (wobei der Zustand eines Balls das Gitterquadrat ist, in dem er sich befindet, und in welche Richtung er sich bewegt). Wenn Sie sehen, dass es einen früheren Zustand wiederholt, wissen Sie, dass es für immer wiederholt wird und Sie die Bewegung nicht mehr weiter verfolgen können. Auf diese Weise dauert es höchstens, die Bewegung des Balls zu verfolgenO ( m n ) Zeit im schlimmsten Fall.
Dies kann beschleunigt werden, indem ein wenig einfache Algebra verwendet wird, um zu berechnen: "Was ist angesichts des aktuellen Zustands die nächste Wand, auf die der Ball trifft?" imO ( 1 ) Zeit - das wird schneller, aber nicht einfacher.
Es gibt eine elegantere und effizientere Lösung, die auf der Zahlentheorie und der Technik von Tom Van der Zanden basiert, das Gitter unendlich zu erweitern .
Stellen Sie sich ein Paralleluniversum vor, in dem sich der Ball in einer geraden Linie in einem unendlichen Gitter bewegt. Wie Tom sagt, ist das Abprallen von den Wänden in unserem Universum gleichbedeutend mit einer geraden Linie im Paralleluniversum. Dies ist die erste Erkenntnis, die wir nutzen werden.
Lassen Sie uns die Implikationen dieser Einsicht herausarbeiten. In unserem Universum beginnt der Ball an einer Anfangskoordinate(x0,y0)Wir wollen wissen, ob wir jemals die Koordinate erreichen werden (x',y'). Was bedeutet das im unendlichen Universum? Stellen Sie sich vor, Sie platzieren Minen an Koordinaten(x',y'), (x', 2 n -y'), (x',y'+ 2 n ), (x', 4 n -y'), ..., ( 2 m -x',y'), ( 2 m -x', 2 n -y'), ... - insbesondere an Koordinaten ( 2 i m ±x', 2 j N ±y') wo ich , jBereich über alle ganzen Zahlen. Dann behaupte ich, dass der Ball irgendwann die Koordinate erreichen wird(x',y')in unserem Universum genau dann, wenn der Ball irgendwann eine Mine im Paralleluniversum treffen wird. Unser Problem beschränkt sich also auf die Frage: Wird der Ball im Paralleluniversum jemals eine Mine treffen?
Die zweite Erkenntnis ist, dass wir die Zahlentheorie verwenden können, um diese Frage zu beantworten. Insbesondere nacht Zeiteinheiten wird der Ball in Position sein (x0+ t ,y0+ t )im Paralleluniversum. Wir wollen wissen, ob es ganze Zahlen gibtt , i , j so dass x0+ t = 2 i m ±x' und y0+ t = 2 j n ±y'. Wenn wir diese Gleichungen neu anordnen und die Sprache der modularen Arithmetik verwenden, fragen wir, ob es eine ganze Zahl gibtt so dass beide der folgenden Gleichungen gelten:
tt≡ ±x'- -x0( mod2 m ) ,≡ ±y'- -y0( mod2 n ) .
Jetzt sind wir alle bereit, die Zahlentheorie anzuwenden. Dies ist insbesondere perfekt eingerichtet, um den chinesischen Restsatz anzuwenden . DefinierenG= 2 gcd ( m , n ). Dann hat das obige Gleichungssystem genau dann eine Lösung in den ganzen Zahlen
±x'- -x0≡ ±y'- -y0( modG) .
Mit anderen Worten, wir sollten die folgenden vier Bedingungen überprüfen:
- x'- -x0≡y'- -y0( modG)
- - -x'- -x0≡y'- -y0( modG)
- x'- -x0≡ -y'- -y0( modG)
- - -x'- -x0≡ -y'- -y0( modG)
Wenn eine dieser vier Bedingungen zutrifft, gibt es eine Lösung für das obige Gleichungssystem, und daher trifft der Ball im Paralleluniversum auf eine Mine. Wenn keine dieser vier Bedingungen erfüllt ist, wird der Ball niemals eine Mine treffen. (Diese 4 Bedingungen sind die relevanten Bedingungen, wenn sich der Ball anfänglich in NE bewegt. Die anderen Richtungen können mit einem ähnlichen Satz von 4 Bedingungen symmetrisch behandelt werden.)
Wenn wir das ursprüngliche Problem umformulieren, erhalten wir eine Lösung für das ursprüngliche Problem, die einfach zu implementieren ist und ausgeführt wird O ( 1 )Zeit. Wir berechnenG= 2 gcd ( m , n )und überprüfen Sie die vier Bedingungen in der Aufzählungsliste oben. Wenn eine der vier Bedingungen zutrifft, lautet die Antwort ja: Der Ball wird schließlich den Punkt erreichen(x',y'). Wenn keine der vier Bedingungen erfüllt ist, lautet die Antwort nein: Der Ball wird niemals den Punkt erreichen(x',y').