Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Frage zu einem Sudoku- Solver

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
REZK



Anmeldungsdatum: 28.10.2004
Beiträge: 109
Wohnort: Stuttgart

BeitragVerfasst am: 03.08.2007, 17:12    Titel: Frage zu einem Sudoku- Solver Antworten mit Zitat

Hallo,

ich habe einen Sudoku Solver programmiert, der leider nicht ganz in meinem Sinne funktioniert. böse

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
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 03.08.2007, 20:05    Titel: Antworten mit Zitat

Unter

http://forum.qbasic.at/viewtopic.php?t=2141

habe ich sonst selber einen Sudoku-Löser (übrigens verschiedene Versionen und Methoden) + auch weiterführende Hinweise/Analyseprogramme rund um dieses Kulträtsel veröffentlicht.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz