Hey Leute,
ich möchte in Java ein Sudoku Programm schreiben (besser: ich SOLL es für die schule...) und jetzt sitz ich hier, und habe mir die "Dancing Links" Methode ausgesucht (siehe: sudokugarden.de). Also ein Int Array mit int[729][324] erzeugt. Soweit kein Problem.
Es gilt ja das exakt Cover Problem zu lösen. B0 heißt in Kästchen 1 steht die Ziffer 1, B1 heit in Kästchen 1 steht die Ziffer 2, usw. bis halt B729 heißt, dass in Kästchen 81 eine steht. Ich hatte es so vor, dass von oben erst nach rechts, und dann in der nächsten Zeile wieder nach rechts usw. gezählt wird (nur damit wir uns bei der Kästchennummerierung einig sind...)
So es gilt Allgemein Bx (x ist die Nummer der Kombinationsmöglichkeit) ist in einem bestimmten Kästchen (nennen wir das mal y). Die Ziffer, die dort gespeichert wird ermittle ich mit
Den Kasten zu ermitteln ist auch nicht schwer:
Die Spalte muss ich ja so ermitteln:
So jetzt kommt aber ein erstes Problem: Wie ermittle ich die Reihe(auf das 9*9 Sudokufeld bezogen)?
Ich bin glaub ich nah dran, komm aber nich drauf...
Ich würd mit Spalte arbeiten und durch 9 teilen, bzw. %9, keine Ahnung, kanns mir einer sagen?
So, dann komm ich zu meiner Tabelle, wie würdet ihr die Spalten machen? Es sind ja immer 324 Bedingungen, jeweils 81 für "Jede Ziffer muss in jeder Spalte einmal vorkommen", "Jeder Ziffer muss in jeder Reihe einmal vorkommen", "Jede Ziffer muss in jedem Block einmal vorkommen", und "In jeder Zelle darf jede Zahl nur einmal stehen" (die letzte müsste mir mal einer erklären....).
Mein erster Anstz für die Spalten ist: Erst kommen 81 Spalten mit z.B. den Reihen (1. Spalte: "Die Ziffer 1 steht in der ersten Reihe", 2. Spalte: "Die Ziffer 2 steht in der ersten Reihe", halt wie in der senkrechten...), dann der Reihe nach Spalten, Blöcke, und Zelle(???:L)
Weil ich das mit dem Zeiger nicht kann, möchte ich einfach zwei Boolean Arrays erstellen, jeweils eindimensional... Zu beginn sind die 729 und 324 Werte alle true, wenn ich ne Spalte oder Zeile "lösche", wird der Wert auf false gesetzt...
So, das wars für erste, wer bis hier gelesen hat, bei dem bedank ich mich schonmal, auch wenn er vlt. nicht helfen kann, oder nur ein Problem lösen kann...
ich möchte in Java ein Sudoku Programm schreiben (besser: ich SOLL es für die schule...) und jetzt sitz ich hier, und habe mir die "Dancing Links" Methode ausgesucht (siehe: sudokugarden.de). Also ein Int Array mit int[729][324] erzeugt. Soweit kein Problem.
Es gilt ja das exakt Cover Problem zu lösen. B0 heißt in Kästchen 1 steht die Ziffer 1, B1 heit in Kästchen 1 steht die Ziffer 2, usw. bis halt B729 heißt, dass in Kästchen 81 eine steht. Ich hatte es so vor, dass von oben erst nach rechts, und dann in der nächsten Zeile wieder nach rechts usw. gezählt wird (nur damit wir uns bei der Kästchennummerierung einig sind...)
So es gilt Allgemein Bx (x ist die Nummer der Kombinationsmöglichkeit) ist in einem bestimmten Kästchen (nennen wir das mal y). Die Ziffer, die dort gespeichert wird ermittle ich mit
Java:
int ziffer = (x%9)+1;
Java:
int kasten = ((a-ziffer+1)/9)+1;
Java:
int spalte = ((kasten-1)%9)+1;
Ich bin glaub ich nah dran, komm aber nich drauf...
Ich würd mit Spalte arbeiten und durch 9 teilen, bzw. %9, keine Ahnung, kanns mir einer sagen?
So, dann komm ich zu meiner Tabelle, wie würdet ihr die Spalten machen? Es sind ja immer 324 Bedingungen, jeweils 81 für "Jede Ziffer muss in jeder Spalte einmal vorkommen", "Jeder Ziffer muss in jeder Reihe einmal vorkommen", "Jede Ziffer muss in jedem Block einmal vorkommen", und "In jeder Zelle darf jede Zahl nur einmal stehen" (die letzte müsste mir mal einer erklären....).
Mein erster Anstz für die Spalten ist: Erst kommen 81 Spalten mit z.B. den Reihen (1. Spalte: "Die Ziffer 1 steht in der ersten Reihe", 2. Spalte: "Die Ziffer 2 steht in der ersten Reihe", halt wie in der senkrechten...), dann der Reihe nach Spalten, Blöcke, und Zelle(???:L)
Weil ich das mit dem Zeiger nicht kann, möchte ich einfach zwei Boolean Arrays erstellen, jeweils eindimensional... Zu beginn sind die 729 und 324 Werte alle true, wenn ich ne Spalte oder Zeile "lösche", wird der Wert auf false gesetzt...
So, das wars für erste, wer bis hier gelesen hat, bei dem bedank ich mich schonmal, auch wenn er vlt. nicht helfen kann, oder nur ein Problem lösen kann...