Sie erhalten ein mxn-Raster. Eine dimensionslose Kugel wird in der Mitte eines der Gitterquadrate platziert und bewegt sich in eine von vier Richtungen: Nordosten, Nordwesten, Südosten oder Südwesten. Der Ball bewegt sich weiter, bis er den Rand des Bretts erreicht. An diesem Punkt springt er gemäß den Gesetzen der Physik zurück.
Kann mit m, n, der Anfangsposition und -richtung (NE / NW / SE / SW) des Balls bestimmt werden, ob der Ball jemals ein bestimmtes Zielgitterquadrat (x0, y0) erreichen wird?
Es ist möglich, die Frage zu beantworten, indem man die Bewegung des Balls ausführlich verfolgt. Gibt es jedoch eine einfachere und effizientere Alternative? Hinweise auf verwandte Literatur wären ebenfalls sehr willkommen.
algorithms
computational-geometry
Mandar Mitra
quelle
quelle
Antworten:
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 , j Bereich ü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:
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
Mit anderen Worten, wir sollten die folgenden vier Bedingungen überprüfen:
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 wirdO ( 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') .
quelle