Alle Möglichen Tic Tac Toe Gewinnen-Kombinationen
Hatte ich ein interview waren, wurde ich gebeten, eine scheinbar einfache Algorithmus Frage: "Schreiben Sie einen Algorithmus, um zurückzukehren, mir alle möglichen Gewinnkombinationen für tic tac toe." Ich kann immer noch nicht herausfinden, eine effiziente Möglichkeit, dies zu behandeln. Gibt es einen standard-Algorithmus oder gemeinsam angewendet werden sollen, um ähnliche Fragen wie diese, ich bin mir nicht bewusst?
paxdiablo Antwort funktioniert; Sie könnte auch den Ansatz der "anderen Seite": start von leer board, und spielen alle möglichen Spiel, verfolgen Sie den final gewinnen-Positionen erreicht. Dies würde mehr Arbeit als paxdiablo Antwort, aber für ein komplexeres Spiel als tic tac toe könnte dann einfacher sein.
InformationsquelleAutor DroidT | 2015-02-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eines jener Probleme, das ist eigentlich einfach genug für brute-force-und, während Sie könnte verwenden Kombinatorik, Graphentheorie, oder viele andere komplexe tools, um es zu lösen, ich würde eigentlich beeindruckt sein von den Antragstellern, die Tatsache anzuerkennen, es gibt einen einfacheren Weg (zumindest für dieses problem).
Gibt es nur 39, oder 19,683 möglichen Kombinationen der Platzierung
x
,o
oder<blank>
im Netz, und nicht alle von denen sind gültig.Erste, eine gültige Spiel-position ist eine, wo der Unterschied zwischen
x
undo
zählt, ist nicht mehr als eine, da Sie abwechselnd bewegt.Darüber hinaus ist es unmöglich, einen Zustand, in dem beide Seiten drei in einer Reihe, so können Sie abgezogen werden, wie gut. Wenn beide haben drei in einer Reihe, dann eine von Ihnen gewonnen hätte, die in der vorherigen bewegen.
Es ist tatsächlich eine weitere Einschränkung ist, dass es unmöglich für eine Seite gewonnen zu haben zwei verschiedene Möglichkeiten, ohne eine gemeinsame Zelle (wieder, Sie würde gewonnen haben in einem früheren verschieben), was bedeutet, dass:
nicht erreicht werden kann, während:
werden kann. Aber können wir eigentlich ignorieren, da es keine Möglichkeit zu gewinnen, zwei Wege, ohne eine gemeinsame Zelle, ohne schon gegen die "maximale Differenz von eins" - Regel, da braucht man sechs Zellen, wobei der Gegner nur mit drei.
Also ich würde einfach mit roher Gewalt und, für jede position, wo der Unterschied ist null oder eins zwischen den Grafen, überprüfen Sie die acht ausgezeichneten Möglichkeiten für beide Seiten. Unter der Annahme nur einer von Ihnen hat den Sieg, das ist legal, zu-gewinnen-Spiel.
Unten ist ein proof-of-concept in Python, aber erst die Ausgabe von
time
bei Ausführung auf dem Prozess der das senden der Ausgabe/dev/null
zu zeigen, wie schnell es ist:Code:
Als ein Kommentator hat darauf hingewiesen, gibt es eine weitere Einschränkung. Der Gewinner für ein bestimmtes board kann nicht weniger Zellen als die Verlierer da, dass heißt der Verlierer nur verschoben, obwohl der Gewinner schon gewonnen auf den letzten Zug.
Werde ich nicht ändern Sie den code das zu berücksichtigen, aber es wäre eine einfache Materie, zu überprüfen, wer hat die meisten Zellen (die Letzte person, die umgezogen ist) und die Sicherstellung der Gewinnlinie zu Ihnen gehörte.
Ich bekam Ihren Punkt 🙂 Total vergaß Raum option, also nehme ich wieder mein Kommentar 🙂
Ein Unterschied, der einen bewegen sollte nicht erlaubt sein, in beide Richtungen. Der Verlierer kann sich nicht bewegen, nachdem der Gegner gewonnen hat.
guter Punkt, werde ich hinzufügen, dass in der Antwort, aber ich nicht die Mühe mit dem ändern des Codes.
Danke @paxdiablo für die ausführliche Antwort! Würden Sie bitte klären, was Los ist mit dem code, speziell in der letzten for-Schleife, für uns nicht php-Entwickler?
InformationsquelleAutor paxdiablo
Andere Möglichkeit könnte sein, starten Sie mit jeder der acht Positionen gewinnen,
und rekursiv füllen Sie alle rechtlichen Kombinationen (beginnen Sie mit dem einfügen von 2
o
's, dann fügen Sie einex
für jedeno
; vermeideno
Gewinn-Positionen):InformationsquelleAutor גלעד ברקן
Dies ist ein java-äquivalent-code-Beispiel
Paket testit;
public class TicTacToe {
}
`
InformationsquelleAutor Vijay Rumao
Heute hatte ich ein interview mit Apple und ich hatte die gleiche Frage. Ich konnte nicht denken, nun, in diesem moment. Später wird man auf, bevor Sie sich zu einem treffen schrieb ich die Funktion für die Kombinationen in 15 Minuten, und als ich zurück kam aus der Versammlung schrieb ich die überprüfung der Funktion wieder in 15 Minuten. Ich werde nervös bei interviews, die Apple nicht vertraut meinem Lebenslauf, den Sie nur glauben, was Sie sehen in dem interview, ich gebe Ihnen keine Schuld, viele Unternehmen sind die gleichen, ich sage nur, dass etwas in dieser Einstellung sieht nicht ganz schlau.
Sowieso, hier ist meine Lösung in Swift 4, es sind 8 Zeilen code, die für die Kombinationen-Funktion und 17 Zeilen code zu überprüfen, die eine gültige board.
Prost!!!
InformationsquelleAutor user5117217