Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by JasonDX,
9. Jan 2011
Ich habe das ganze in Pseudo-Code geschrieben. ;)
greetz
Mike
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by JasonDX,
27. Dez 2010
Es geht sowohl mit einem einfachen i, als auch mit einem (X,Y)-Paar.
Mit einer einzelnen Variable würde es so funktionieren, dass man aus der Variable dann die X und Y-Koordinaten berechnet (Mit mod und div). Andernfalls kann man auch einfach nur die Unterscheidung zu Beginn der Funktion machen: Wenn X > Size, dann X := 1 und inc(Y).
Hm, ich glaube am verwirrendsten ist das return. return...
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by JasonDX,
26. Dez 2010
Ja ;) Du rufst SetzeFeld für das 1. Feld auf, und das füllt dann durch die rekursiven Aufrufe das gesamte Sudoku.
Hier mal die Fehler die mir beim groben Überfliegen aufgefallen sind:
Die Variable GültigeEntscheidungen aus dem PseudeCode ist eine Menge; Die Bedingung für die While-Schleife ist an die Anzahl der Elemente in dieser Menge geknüpft. Am einfachsten gehts hier tatsächlich mit...
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by JasonDX,
26. Dez 2010
Das ist die Abbruchbedingung. i zählt mit, das wievielte Feld gerade gefüllt wird. Wenn i dann größer als Size*Size ist, dann hat man bereits alle Felder gefüllt.
Das ist eine Liste oder ein Array (in dem Fall eigentlich egal), und enthält, welche Entscheidungen gültig sind, bzw. noch nicht durchprobiert wurden.
Durchaus - allerdings muss man damit aufpassen, wenn man zu viel damit optimiert....
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by JasonDX,
20. Dez 2010
Grob beschrieben ist das Backtracking. Man trifft Entscheidungen, und wenn man an einen Widerspruch/Fehler gerät, ändert man eine (normalerweise die letzte) Entscheidung und probiert dann weiter. Wikipedia hat auch nen eigenen Eintrag dazu.
Auf Sudoku angewand würde das ca. so aussehn (der Einfachheit halber rekursiv beschrieben):
SetzeFeld(i)
Wenn i > Size*Size
return true;...
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by JasonDX,
20. Dez 2010
Ein Fehler im Code ist folgender:
Statt der 4 sollte ein Size hin, ansonsten würde das Generieren nur mit 4x4-Sudokus funktionieren.
Zudem fehlt das Backtracking in deinem Algorithmus. Mal angenommen du willst ein 4x4-Sudoku generieren, und dein Programm ist bei folgendem Sudoku angelangt:
1 2 3 4
2 3 1 xIst soweit alles gültig, bloß wird dein Programm hier für x keine Zahl finden, für die...