Dies ist ein häufiges Rätsel, das viele von Ihnen manuell gelöst haben. Jetzt ist es an der Zeit, einen Algorithmus zu schreiben, um dasselbe zu lösen.
Es gibt gleich viele Matchsticks, die in zwei verschiedenen Seiten in einer Richtung zueinander angeordnet sind. Es gibt einen einzigen leeren Raum zwischen ihnen. Sagen Sie etwas wie die folgende Abbildung (wenn die Gesamtzahl der Matchsticks 4 beträgt).
Jeder Stock kann entweder einen Schritt nach vorne schieben (wenn der unmittelbare vordere Raum frei ist) oder er kann über einen Stock in seiner Vorderseite gesprungen werden und in den freien Raum landen (wenn dieser Raum frei ist). Die Bewegung in umgekehrter Richtung ist nicht möglich (auch der Platz ist frei). Ein Rückwärtssprung ist ebenfalls nicht zulässig. In einem Schritt ist nur eine Bewegung zulässig.
Jetzt müssen Sie einen Algorithmus schreiben, um die erforderlichen Mindestschritte zu ermitteln, mit denen alle Match-Sticks auf der linken Seite auf der rechten Seite und alle Match-Sticks auf der rechten Seite auf der linken Seite landen.
Zum Beispiel: Wenn es insgesamt 2 Streichhölzer gibt (1 auf jeder Seite), sind die Schritte:
Hinweis: In der obigen Abbildung wurde der linke Seitenstock zuerst bewegt. Eine andere Lösung besteht, wenn sich der rechte Seitenstab zuerst bewegt. Für dieses Problem müssen Sie jedoch nur eine Lösung angeben. Dies setzt auch voraus, dass sich der linke Stick zuerst bewegt.
Die folgende Abbildung beschreibt die Bewegungen mit 4 Streichhölzern (2 auf jeder Seite):
Hinweis: In der obigen Abbildung wurde der linke Seitenstock zuerst bewegt. Eine andere Lösung besteht, wenn sich der rechte Seitenstab zuerst bewegt. Für dieses Problem müssen Sie jedoch nur eine Lösung angeben. Dies setzt auch voraus, dass sich der linke Stick zuerst bewegt.
[Annahme: Die Eingabe kann eine beliebige gerade Zahl zwischen 02 und 14 sein (dh 1 bis 7 Matchsticks auf jeder Seite). Für Eingaben außerhalb dieses Bereichs müssen Sie weder eine Validierung durchführen noch eine Fehlermeldung angeben. Hinweis: In der Ausgabe wird jeder Schritt durch ein '|' getrennt. (Rohr-) Charakter. COBOL-Programmierer sollten immer PIC 9 (2) als Eingabegröße annehmen und können auch davon ausgehen, dass die Ausgabe eine feste maximale Länge von 450 Zeichen hat und rechts mit Leerzeichen aufgefüllt ist.]
Beispieleingabe:
02
Beispielausgabe:
01To02|03To01|02To03|
Beispieleingabe:
04
Beispielausgabe:
02To03|04To02|05To04|03To05|01To03|02To01|04To02|03To04|
Beispieleingabe:
06
Beispielausgabe:
03To04|05To03|06To05|04To06|02To04|01To02|03To01|05To03|07To05|06To07|04To06|02To04|03To02|05To03|04To05|
quelle
Antworten:
APL 129
Der folgende Code übernimmt die Bildschirmeingabe und -ausgabe in dem angegebenen Format auf dem Bildschirm:
Ein gutes Drittel des Codes wird für die Formatierung der Ausgabe benötigt. Die Logik wird durch das Auftreten des Symbols ⋄ im Code vervollständigt.
Unten ist das Ergebnis für eine Eingabe von 08 zur Überprüfung:
quelle
Javascript
178 174161prompt
s fürn
dannalert
s Antwort. (Keine0
Polsterung)Neueste:
2:
1:
Dies verwendet das Konzept, dass das Muster gespiegelt wird:
Also, wo
n=2
ist das Bewegungsmuster:Welches entspricht
Dieses Muster wiederholt sich wie folgt (
n=8
)Wir können hier einige Muster feststellen:
n/2
, was sich dreimal wiederholt, und verringert sich dann wieder auf 1.1
ist und die Anzahl der aufeinanderfolgenden Sprünge von 1 auf 1n/2
sinkt.n=14
::Beispielausgabe:
f(2)
::f(8)
::f(40)
::Hier ist ein Pseudocode, um die Methode zu demonstrieren:
quelle
l/L/r/R
und klarer istm/j
. Ich mag die Idee, die Distanz von der Richtung zu trennenC -
216213Meine Lösung basiert auf zwei Fakten:
Das Feld "bis" ist das Feld "von" des vorherigen Zugs (da Sie in dem Feld, aus dem Sie sich bewegen, immer einen leeren Platz erstellen und immer zu einem leeren Platz wechseln).
Die Entfernungen und Richtungen, die bewegt werden, weisen ein sehr regelmäßiges Muster auf. Für die ersten 3 Testfälle sind dies:
1 -2 1
1 -2 -1 2 2 -1 -2 1
1 -2 -1 2 2 1 -2 -2 -2 1 2 2 -1 -2 1
In diesem Sinne habe ich im Grunde nur ein Programm geschrieben, um dieses Muster zu produzieren und fortzusetzen. Ich bin mir ziemlich sicher, dass es eine wirklich schöne und viel elegantere rekursive Art geben muss, dies zu schreiben, aber ich habe es noch nicht herausgefunden:
Und Golf gespielt (obwohl dies eine Code-Herausforderung war, kein Golf):
quelle
scanf
. Ich aktualisiere meine Antwort mit einer besseren Version.N(2)=rLr
,N(4)=rLlRRlLr
,N(6)=rLlRRrLLLrRRlLr
etc.Mathematica
Dieser Ansatz erstellt eine
Nest
ed-Sequenz der Größe und Richtung der Bewegungen, die{fromPosition,toPosition}
beginnend mit der Position formatiertn
ist undn
sich auf die Anzahl der Übereinstimmungspaare bezieht. Es ist dannFold
die Sequenz in eine Funktion, die mit dem Verschieben beginnt{n, n+1}
.Visualisierung der Swaps
r
,,b
undo
sind Bilder oder eine rote Übereinstimmung, eine blaue Übereinstimmung bzw. keine Übereinstimmung.Im Folgenden wird die Ausgabe von formatiert
z
, um die Swaps mit Übereinstimmungen anzuzeigen.swaps
Erzeugt eine Liste von Zuständen, indem die geordneten Paare vonz
as-Befehlen verwendet werden, um die anfängliche Liste und nachfolgende Listen zu permutieren.swapMatches
Zeigt die Zustände in einem Raster an.quelle
Javascript 191
Zeichen gezählt mit
grep =|tr -d \ |wc -c
quelle
02
sind die Werte korrekt, es fehlt jedoch die nachfolgende|
. In den beiden anderen Fällen sind die Werte weit entfernt und die Formatierung von10
ist ebenfalls falsch. Auch nicht sicher über Ihre Charakterzählmethode. Warum zählen Sie nur den Funktionskörper abzüglich der Rendite?tr -d \ |wc -c
berücksichtigt Zeilenumbrüche