Schachbrett
-
Ich möchte eine if Schleife machen, wie z.B.:
"von Schachbrett[0][0] bis Schachbrett[0][7]" = Spalte1; if ( "irgendein Feld der Spalte1" = 1) // 1 Für das Setzen einer Dame Spalte1 = 1;
Oder gibt es etwas wie "von bis" nicht und muss ich jedes Feld einzeln einlesen o.ä.?
-
xStrykex schrieb:
Ich möchte eine if Schleife machen ...
xStrykex schrieb:
Oder gibt es etwas wie "von bis" nicht und muss ich jedes Feld einzeln einlesen o.ä.?
Alles einzeln.
-
DirkB schrieb:
xStrykex schrieb:
Ich möchte eine if Schleife machen ...
Die Frage war nicht auf if Schleifen, sondern auf das "von bis" bezogen
DirkB schrieb:
xStrykex schrieb:
Oder gibt es etwas wie "von bis" nicht und muss ich jedes Feld einzeln einlesen o.ä.?
Alles einzeln.
Wäre es dann evt sinnvoller, es mit einer switch-Anweisung zu versuchen?
-
Wenn du von deine komischen Arrays weggehst, ließe sich das evtl. einfacher erledigen.
such dir eine Matrix (da gibts bestimmt was passendes in der std und/oder boost), da müsstest du dann recht einfach die Zeilen- bzw. Spaltensumme ermitteln können. Wenn diese "0" ergibt, befindet sich in der Zeile bzw. Spalte noch keine Dame.
-
daddy_felix schrieb:
Wenn du von deine komischen Arrays weggehst, ließe sich das evtl. einfacher erledigen.
such dir eine Matrix (da gibts bestimmt was passendes in der std und/oder boost),
Ich kenne bislang nur Vektoren und 1/2 D Array (3D bräuchte man wohl so gut wie nie, deswegen hab ich die weggelassen).
Ich wüsste jetzt nichts, was man anstelle von dem Array benutzen könnte(?).daddy_felix schrieb:
da müsstest du dann recht einfach die Zeilen- bzw. Spaltensumme ermitteln können. Wenn diese "0" ergibt, befindet sich in der Zeile bzw. Spalte noch keine Dame.
*KopfaufTisch* Auf die Idee bin ich noch gar nicht gekommen, danke.
Über tausend andere Ecken gedacht.
-
xStrykex schrieb:
daddy_felix schrieb:
Wenn du von deine komischen Arrays weggehst, ließe sich das evtl. einfacher erledigen.
such dir eine Matrix (da gibts bestimmt was passendes in der std und/oder boost),
Ich kenne bislang nur Vektoren und 1/2 D Array (3D bräuchte man wohl so gut wie nie, deswegen hab ich die weggelassen).
Ich wüsste jetzt nichts, was man anstelle von dem Array benutzen könnte(?).daddy_felix schrieb:
da müsstest du dann recht einfach die Zeilen- bzw. Spaltensumme ermitteln können. Wenn diese "0" ergibt, befindet sich in der Zeile bzw. Spalte noch keine Dame.
*KopfaufTisch* Auf die Idee bin ich noch gar nicht gekommen, danke.
Über tausend andere Ecken gedacht.
Sry, aber würde das gerne wissen
-
du könntest dir mal boost::multiarray ansehen, vielleicht bietet das die Möglichkeiten, die du brauchst.
-
xStrykex schrieb:
Ich kenne bislang nur Vektoren und 1/2 D Array (3D bräuchte man wohl so gut wie nie, deswegen hab ich die weggelassen).
Ich wüsste jetzt nichts, was man anstelle von dem Array benutzen könnte(?).Sry, aber würde das gerne wissen
Hallo xStrykex,
bevor Du Dir tiefere Gedanken über 2D-Arrays gleich welcher Art machst, solltest Du vielleicht über den Algorithmus nachdenken, der die Lösungen für das 8-Damen-Problem liefert. Zur Zeit gehst Du anscheinend noch davon aus, dass Du ein 'ganzes Schachbrett' dafür benötigst.
Wie willst Du vorgehen - die Damen 'irgendwie' auf das Brett stellen und dann schauen, ob eine Stellung vorhanden ist, bei der keine der Damen eine andere schlagen kann?
Es gibt 64 über 8 Möglichkeiten 8 Damen auf ein Brett zu stellen - also gut 4,4E+9. Um eine Stellung zu prüfen musst Du 4 mal 64 Felder inspizieren (bzw. summieren), wenn Du nach oben angesagter Methode vorgehst. 2mal für die waagerechten und 2mal für die diagonalen Schlagmöglichkeiten. Wenn Dein Computer pro Feld nur 1ns (1E-9s) benötigt, so wären das immerhin ca. 1126s also knapp 19min. Und wenn der PC 2ns pro Feld benötigt ...Bei 8 Damen, die sich gegenseitig nicht schlagen sollen, steht doch von vornherein fest, dass auf jeder Reihe und in jeder Linie(Spalte) genau eine Dame steht. Man könnte z.B. für jede einzelne Dame vorher festlegen auf welcher Linie(von a bis h bzw. Linie1 bis Line8) sie stehen soll. Und anschließend verteilt man sie auf die einzelnen Reihen und muss anschließend 'nur noch' prüfen, ob sich zwei Damen über einen Läuferzug bedrohen. Da jede Dame ihre Liniennummer 'in sich trägt', reicht ein 1-dimensionals Feld mit eben 8 verschieden (Linien)Nummern. Die Position der Nummer im Feld gibt die Reihe an: z.B. 12345678 hier schlagen sich alle Damen, da sie alle auf der Diagonale stehen, oder 57263148 was eine der Lösungen des 8-Damen-Problems ist.
Für die Permutation von 8 verschiedenen Elementen gibt es nur 8!=40320 Möglichkeiten. Wenn der Computer alle Stellungen prüfen muss (Bruce Force) und für die Prüfung einer Stellung genauso lange braucht, wie oben (256E-9s) so wäre er nach gut 0,01s fertig.
.. und wenn man es statt mit 'Bruce Force' noch etwas geschickter anstellt, so ist er noch schneller fertig.Gruß
Werner
-
Hallo Werner,
Werner Salomon schrieb:
Zur Zeit gehst Du anscheinend noch davon aus, dass Du ein 'ganzes Schachbrett' dafür benötigst.
Stimmt. Ich dachte an ein Array (8x8), worauf ich eine Dame setze, nun sollte das Feld der platzierten Dame und alle waagerechten/seknrechten/diagonalen Felder mit false gekennzeichnet werden (bool Array). Danach nur noch die Felder überprüfen, wo das nächste Feld mit true ist, solange bis entweder eine Lösung gefunden wurde oder min. 1 Dame nicht mehr setzbar wäre, da das ganze Feld schon "false" ist (Dann eine Dame zurück und auf anderes Feld,...).
Ist das realisierbar oder gar unsinnig?
-
xStrykex schrieb:
Hallo Werner,
Werner Salomon schrieb:
Zur Zeit gehst Du anscheinend noch davon aus, dass Du ein 'ganzes Schachbrett' dafür benötigst.
Stimmt. Ich dachte an ein Array (8x8), worauf ich eine Dame setze, nun sollte das Feld der platzierten Dame und alle waagerechten/seknrechten/diagonalen Felder mit false gekennzeichnet werden (bool Array). Danach nur noch die Felder überprüfen, wo das nächste Feld mit true ist, solange bis entweder eine Lösung gefunden wurde oder min. 1 Dame nicht mehr setzbar wäre, da das ganze Feld schon "false" ist (Dann eine Dame zurück und auf anderes Feld,...).
Ist das realisierbar oder gar unsinnig?Sicher ist das realisierbar.
Tipp: denke noch mal nach, was bei 'Dame zurück' mit den 'mit false gekennzeichneten Feldern' passieren soll. Vielleicht nimmst Du eher ein 'int Array' und inkrementierst das Feld, wenn es belegt wird und dekrementierst es wieder bei 'Dame zurück'.Gruß
Werner