REZK
Anmeldungsdatum: 28.10.2004 Beiträge: 109 Wohnort: Stuttgart
|
Verfasst am: 03.08.2007, 17:12 Titel: Frage zu einem Sudoku- Solver |
|
|
Hallo,
ich habe einen Sudoku Solver programmiert, der leider nicht ganz in meinem Sinne funktioniert.
Die Funktionsweise ist wie folgt:
- Lese die Daten aus einer Datei in die oberste Ebene eines (9,9,10) Arrays ein, im gleichen Zug werden alle Felder unter einem mit 0 (=leer) besetzten Feld in der z- Ebene mit 2, die vollen Felder mit 1 vorbelegt
- Gehe für jedes Feld <> 0 in der obersten (z) Ebene alle Felder in der x und in der y- Ebene und dem umgrenzednen 3x3 Gebiet durch und setze alle dort gefundenen Werte durch entsprechendes Belegen der felder in der z- Ebene um.
Der Raum (1,1,2) -(9,9,10) ist jetzt entweder mit 1 oder mit 2 belegt, 1 bedeutet, dass die Zahl des Z- Index als Lösung für das entsprechende Feld z=1 in Frage kommt.
1
- Laufe jede x- und y- Achse und das 3x3 Gebiet ab, zähle die Anzahl der 1er, wenn die Anzahl 1 ist, heißt das das in der Ebene z=1 darüber liegende Feld eindeutig bestimmt ist. Schreibe den z Index in das entsprechende Feld in der obersten Linie und belege alle abgelaufenen felder mit 2.
- Laufe diez Achse genauso ab, wenn sich genau eine Lösung ergibt, trage sie in das entsprechende Feld in der obersten Ebene ein und lösche belege ebenfalls alle betroffenen Felder mit 2.
- Gehe nach 1 bis alle Felder des Sudoku- Spiels bestimmt sind.
- Schreibe die oberste Ebene zurück in eine Datei.
Meine Frage: Lässt sich auf diese Art und Weise theoretisch ein (jedes?) Sudoku Spiel bestimmen oder ist hier ein Denkfehler drin? Vielleicht ist ja aber nur ein kleiner Schreib-/Programmierfehler im programm dran schuld, dass die ausgespuckten Ergebnisse unvollständig und z.T. falsch sind.
MfG,
baser
Hier mal der bisherige Code:
Code: |
DIM feld(9, 9, 10)
DIM gefunden(10)
OPEN "sudoku.txt" FOR INPUT AS #1 'Daten in Array einlesen und wenn obere Dimension = 0 dann sollen alle drunterliegende felder mit 1 vorgelegt werden
DO WHILE NOT EOF(1)
FOR a = 1 TO 9
FOR b = 1 TO 9
INPUT #1, dateieingabe
feld(a, b, 1) = dateieingabe
IF feld(a, b, 1) = 0 THEN
FOR c = 2 TO 10
feld(a, b, c) = 1
NEXT c
ELSE
FOR c1 = 2 TO 10
feld(a, b, c1) = 2
NEXT c1
END IF
NEXT b
NEXT a
LOOP
CLOSE #1
FOR d = 1 TO 9 'Vorsortierung der m”glichen Ergebnisse
FOR e = 1 TO 9
IF feld(d, e, 1) = 0 THEN
FOR f = 1 TO 9
IF feld(d, f, 1) <> 0 THEN feld(d, e, feld(d, f, 1) + 1) = 2
IF feld(f, e, 1) <> 0 THEN feld(d, e, feld(f, e, 1) + 1) = 2
NEXT f
FOR g = (d - 1) - ((d - 1) MOD 3) + 1 TO (d - 1) - ((d - 1) MOD 3) + 3
FOR h = (e - 1) - ((e - 1) MOD 3) + 1 TO (e - 1) - ((e - 1) MOD 3) + 3
IF feld(g, h, 1) <> 0 THEN feld(d, e, feld(g, h, 1) + 1) = 2
NEXT h
NEXT g
END IF
NEXT e
NEXT d
FOR z = 1 TO 100 'bestimmung der einzelnen sudoku felder in x,y- achse und 3x3 gebiet
FOR c = 2 TO 10
FOR a = 1 TO 9
FOR b = 1 TO 9
IF feld(a, b, c) = 1 THEN
gefunden(1) = gefunden(1) + 1
gefunden(5) = b
END IF
IF feld(b, a, c) = 1 THEN
gefunden(2) = gefunden(2) + 1
gefunden(6) = b
END IF
NEXT b
'
FOR r = (a - 1) - ((a - 1) MOD 3) + 1 TO (a - 1) - ((a - 1) MOD 3) + 3
FOR s = (c - 2) - ((c - 2) MOD 3) + 1 TO (c - 2) - ((c - 2) MOD 3) + 3
IF feld(r, s, c) = 1 THEN
gefunden(3) = gefunden(3) + 1
gefunden(7) = r
gefunden(8) = s
END IF
NEXT s
NEXT r
IF gefunden(1) = 1 THEN
feld(a, gefunden(5), 1) = c - 1
FOR e = 1 TO 9
feld(e, gefunden(5), c) = 2
feld(a, e, c) = 2
NEXT e
FOR f = (a - 1) - ((a - 1) MOD 3) + 1 TO (a - 1) - ((a - 1) MOD 3) + 3
FOR g = (gefunden(5) - 1) - ((gefunden(5) - 1) MOD 3) + 1 TO (gefunden(5) - 1) - ((gefunden(5) - 1) MOD 3) + 3
feld(f, g, c) = 2
NEXT g
NEXT f
END IF
IF gefunden(2) = 1 THEN
feld(gefunden(6), a, 1) = c - 1
FOR h = 1 TO 9
feld(gefunden(6), h, c) = 2
feld(h, a, c) = 2
NEXT h
FOR i = (a - 1) - ((a - 1) MOD 3) + 1 TO (a - 1) - ((a - 1) MOD 3) + 3
FOR g = (gefunden(6) - 1) - ((gefunden(6) - 1) MOD 3) + 1 TO (gefunden(6) - 1) - ((gefunden(6) - 1) MOD 3) + 3
feld(i, g, c) = 2
NEXT g
NEXT i
END IF
IF gefunden(3) = 1 THEN
feld(gefunden(7), gefunden(8), 1) = c - 1
FOR t1 = 1 TO 9
feld(gefunden(7), t1, c) = 2
feld(t1, gefunden(8), c) = 2
NEXT t1
FOR u = (gefunden(7) - 1) - ((gefunden(7) - 1) MOD 3) + 1 TO (gefunden(7) - 1) - ((gefunden(7) - 1) MOD 3) + 3
FOR v = (gefunden(8) - 1) - ((gefunden(8) - 1) MOD 3) + 1 TO (gefunden(8) - 1) - ((gefunden(8) - 1) MOD 3) + 3
feld(u, v, c) = 2
NEXT v
NEXT u
END IF
gefunden(1) = 0
gefunden(2) = 0
gefunden(3) = 0
NEXT a
NEXT c
FOR a = 1 TO 9 'bestimmung in bezug auf z-achse
FOR b = 1 TO 9
FOR c = 2 TO 10
IF feld(a, b, c) = 1 THEN
counter = counter + 1
speicher = c
END IF
NEXT c
IF counter = 1 THEN
feld(a, b, 1) = speicher - 1
FOR d = 1 TO 9
feld(a, d, speicher) = 2
feld(d, b, speicher) = 2
NEXT d
FOR e = (a - 1) - ((a - 1) MOD 3) + 1 TO (a - 1) - ((a - 1) MOD 3) + 3
FOR f = (b - 1) - ((b - 1) MOD 3) + 1 TO (b - 1) - ((b - 1) MOD 3) + 3
feld(e, f, speicher) = 2
NEXT f
NEXT e
END IF
counter = 0
NEXT b
NEXT a
NEXT z
OPEN "test.dat" FOR OUTPUT AS #2 'Testroutine, schreibe in test.dat zurück
FOR a = 1 TO 9
FOR b = 1 TO 9
PRINT #2, feld(a, b, 1),
NEXT b
NEXT a
|
_________________ Meine sämtlichen QB Projekte findet ihr hier |
|