SuDoKu Solver

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • SuDoKu Solver

    Ich hatte das Problem mal in (prozeduralem) C++ (oder ist das doch eher C?) rekursiv gelöst (sollte Backtracking sein ;) ) (christoph.sf-ogame.de/Entwicklung/sudoku.cpp

    Jetzt wollte ich das ohne rekursion in Python angehen, das ganze funktioniert erst fast ;) ich poste mal trotzdem den Code, morgen kommt dann hoffentlich eine funktionierende Version wenn ich den Fehler finde ...

    sudoku.py

    Quellcode

    1. #!/usr/bin/python
    2. # -*- coding: utf-8 -*-
    3. #Backtracking Algorithmus zum Lösen von SuDoKus
    4. #© Christoph Egger
    5. def print_actual(feld):
    6. for line in feld:
    7. for col in line:
    8. print col,
    9. print ""
    10. def read_sudoku(filename):
    11. feld = []
    12. f = file(filename, "r")
    13. data = f.read()
    14. tmp1 = data.splitlines()
    15. for a in tmp1:
    16. feld.append(a.split())
    17. return feld
    18. def test_colum(no, feld):
    19. found = []
    20. for n in feld:
    21. if n[no] != "0":
    22. if n[no] not in found:
    23. found.append(n[no])
    24. else:
    25. return False
    26. return True
    27. def test_row(no, feld):
    28. found = []
    29. for n in feld[no]:
    30. if n != "0":
    31. if n not in found:
    32. found.append(n)
    33. else:
    34. return False
    35. return True
    36. def test_quad(qcol, qrow, feld):
    37. found = []
    38. for trow in feld[(qrow*3):((qrow*3)+3)]:
    39. for tcol in trow[(qcol*3):((qcol*3)+3)]:
    40. if tcol != "0":
    41. if tcol not in found:
    42. found.append(tcol)
    43. else:
    44. return False
    45. return True
    46. def find_next_empty(feld):
    47. for a in feld:
    48. for b in a:
    49. if b == "0":
    50. return (feld.index(a), a.index(b))
    51. return (-1, -1)
    52. def solve_sudoku(feld):
    53. stack = []
    54. solutions = []
    55. start = 1
    56. while True:
    57. pos = find_next_empty(feld)
    58. if pos[0] == -1:
    59. solutions.append(feld)
    60. print "Lösung gefunden: "
    61. print_actual(feld)
    62. print " "
    63. if len(stack):
    64. tmp = stack.pop()
    65. feld[tmp[0][0]][tmp[0][1]] = "0"
    66. start = tmp[1] + 1
    67. else:
    68. return solutions
    69. else:
    70. for num in range(start, 10):
    71. feld[pos[0]][pos[1]] = str(num)
    72. if not test_colum(pos[1], feld):
    73. feld[pos[0]][pos[1]] = "0"
    74. continue
    75. if not test_row(pos[0], feld):
    76. feld[pos[0]][pos[1]] = "0"
    77. continue
    78. if not test_quad(pos[1]/3, pos[0]/3, feld):
    79. feld[pos[0]][pos[1]] = "0"
    80. continue
    81. stack.append((pos, num))
    82. start = 1
    83. break
    84. else:
    85. if len(stack):
    86. tmp = stack.pop()
    87. feld[tmp[0][0]][tmp[0][1]] = "0"
    88. start = tmp[1] + 1
    89. else:
    90. return solutions
    Alles anzeigen

    start_sudoku.py

    Quellcode

    1. #!/usr/bin/python
    2. # -*- coding: utf-8 -*-
    3. #Startet den Backtracker zum Lösen des Sudokus
    4. #© Christoph Egger
    5. import sudoku
    6. import sys
    7. if len(sys.argv) == 1:
    8. print "Der Script erwartet den Dateinamen des zu lösenden SuDoKus als Argument"
    9. else:
    10. feld = sudoku.read_sudoku(sys.argv[1])
    11. sudoku.print_actual(feld)
    12. print type(feld[0][0])
    13. print ""
    14. res = sudoku.solve_sudoku(feld)
    15. if len(res) > 1:
    16. print "Das SuSoKu ist mehrdeutig!"
    17. print "es existieren", len(res), "Lösungen!"
    18. elif len(res) == 0:
    19. print "Das SuDoKu besitzt keine Lösung!"
    20. else:
    21. print "Das SuDoKu ist eindeutig lösbar!"
    Alles anzeigen


    Die SuDoKus haben folgende Form:
    test.sudoku

    Quellcode

    1. 1 0 8 0 0 9 6 0 0
    2. 5 0 0 8 2 0 0 0 0
    3. 0 2 6 0 7 0 0 0 0
    4. 0 5 9 0 0 0 0 6 0
    5. 0 3 0 0 1 0 0 5 0
    6. 0 4 0 0 0 0 3 8 0
    7. 0 0 0 0 9 0 5 7 0
    8. 0 0 0 0 3 7 0 0 6
    9. 0 0 2 4 0 0 9 0 1


    EDIT://
    Fehler behoben

    EDIT://
    Einrückung wiederhergestellt, scheint bei Editieren nicht erhalten zu bleiben ...
    There are only 10 types of people in the world: Those who understand binary, and those who don't.

    Download meines ersten Spiels:HIER
    Über Feedback würde ich mich freuen ;)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von darthdespotism ()

  • Auf irgendeine Weise findet es die erste (und wohl einzigste Lösung) aber versucht danach nicht, weitere Lösungen zu finden und beendet sich auch nicht am Ende ...

    Hat jemand eine Idee?

    Um genau zu sein unterscheiden sich die Lösungen sogar ...

    EDIT://
    Ich bekomme 600 Lösungen für ein normales SuDoKu gemeldet. Das kann eigentlich nicht sein oder?
    There are only 10 types of people in the world: Those who understand binary, and those who don't.

    Download meines ersten Spiels:HIER
    Über Feedback würde ich mich freuen ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von darthdespotism ()

  • Hm ja ein gutes SuDoKu sollte nur eine Lösung haben.

    Mein Programm liefert mir für SuDoKus aus der Zeitung und aus diversen Heften 400 - 600 Lösungen. Ich denke mal da muss ich noch auf Fehlersuche gehen?

    Der nächste Schritt wird es sein, SuDoKus zu erstellen, ich hab da schon so eine Idee ;) aber jetzt muss erstmal der Fehler gefunden werden. (Werd ich selber angehen und mir hier keine Vorschläge holen, in der Hoffnung dabei noch was zu lernen)

    EDIT://
    Das von dir verlinkte Programm schau' ich mir trotzdem gleich mal an

    EDIT:///
    Scheint ein Fehler in der Regel für die Quads zu sein

    EDIT:////
    Fehler gefunden: wenn ich teile eines Array mit [:] wähle muss der 2. Wert eines hinter das letzte erwünschte Item verweisen.
    There are only 10 types of people in the world: Those who understand binary, and those who don't.

    Download meines ersten Spiels:HIER
    Über Feedback würde ich mich freuen ;)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von darthdespotism ()