2016-08-02 12 views
3

Für ein selbst zugewiesenes Projekt habe ich beschlossen, jedes mögliche Spiel von Tic-Tac-Toe zu erstellen. Um jedes dieser Spiele zu speichern und darzustellen, entschied ich mich für eine Matrix mit 9 Spalten und 362880 Zeilen. Jede Reihe ist ein Spiel, in dem die ungeraden Spalten "X" sind und die geraden Spalten "O" sind.Erstellen Sie eine Matrix aller neunstelligen Zahlen, die keine doppelten Ganzzahlen enthalten.

(1,2,3,4,5,6,7, NULL, NULL) repräsentiert ein Spiel, bei dem X gewinnt.

enter image description here

diesem Grund habe ich jede neunstellige Zahl erzeugen möchten, die keine doppelten Zahlen enthält, als eine doppelte ganze Zahl, dass ein Spieler eine Position zu markieren bedeuten würde versucht, die bereits belegt ist.

Im Folgenden finden Sie die Anfänge einer möglichen Methode

#create matrix that can contain all possible arrangements of moves on a tic-tac-toe board 
tictactoematrix <- matrix(ncol = 9, nrow = 362880) 

j = 1 
k = 1 

#create list of possible moves 
move <- list(1,2,3,4,5,6,7,8,9) 

#populate every row with numbers 1-9 
for(i in 1:362880){ 
    tictactoematrix[i,1] <- move[[1]] 
    move[1] <- NULL 
    tictactoematrix[i,2] <- move[[1]] 
    move[1] <- NULL 
    tictactoematrix[i,3] <- move[[1]] 
    move[1] <- NULL 
    tictactoematrix[i,4] <- move[[1]] 
    move[1] <- NULL 
    tictactoematrix[i,5] <- move[[1]] 
    move[1] <- NULL 
    tictactoematrix[i,6] <- move[[1]] 
    move[1] <- NULL 
    tictactoematrix[i,7] <- move[[1]] 
    move[1] <- NULL 
    tictactoematrix[i,8] <- move[[1]] 
    move[1] <- NULL 
    tictactoematrix[i,9] <- move[[1]] 
    move[1] <- NULL 

    move <- list(1,2,3,4,5,6,7,8,9) 
} 

Der Ausgang:

enter image description here

Jetzt offensichtlich das Problem mit ist, dass jede Zeile identisch ist, während ich sie zu jeder möchte sein einzigartig. Und was kann ich nicht für das Leben von mir herauszufinden, ist, wie jede Zahl in der

move <- list(1,2,3,4,5,6,7,8,9)

in jede mögliche Kombination neu zu ordnen.

+4

Sie wollen alle Permutationen erzeugen. Dies wird [SO Antwort] (http://stackoverflow.com/questions/11095992/generating-all-distinct-permutations-of-a-list-in-r) tun. – aichao

+1

Ein Baum scheint eine natürlichere Struktur zu sein, wenn man bedenkt, dass Spiele vor dem letzten Zug enden können. Sie können auch alle Rotations- und Klappsymmetrie reduzieren: Lassen Sie die erste Bewegung "Ecke", "Seite" oder "Mitte" sein und definieren Sie andere Bewegungen relativ dazu. – Frank

+1

Eine gute Datenstruktur wäre ein rekursiver Baum, der einige Kinder und einen Wert (Matrix in Ihrem Fall) hat. Die Zweige wären die erlaubten Bewegungen von dieser Position oder nur alle möglichen Bewegungen, die du dann sauber machst. – FisherDisinformation

Antwort

1

Wenn Sie bereit sind, ein anderes Paket zu verwenden, können Sie dies direkt über:

library(combinat) 

temp <- permn(c(1,2,3,4,5,6,7,8,9)) 
fullTable <- do.call("rbind", temp) 
+1

Sie brauchen die 0 nicht, da es neun Zellen gibt, denke ich. – Frank

+1

Ja, es sollte "permn (seq_len (9))" sein. Wie es ist, erzeugt es alle Permutationen für "10" -Elemente und deshalb haben Sie '10!' Zeilen und nicht die angeforderten '9!' Zeilen. Ich weiß, dass das OP Ihre Antwort bereits akzeptiert hat, aber bitte korrigieren. – aichao

+1

Das hat funktioniert, aber ich habe am Ende die "0" entfernt. Ich habe versucht, es selbst aus der Antwort zu entfernen, aber die Bearbeitung ist zu klein für mich. – user2533660

1

Wenn Sie nur für die Tabelle suchen:

library(permute) 
all_games <- allPerms(1:9, how(maxperm=1e10))