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
Alles anzeigen
start_sudoku.py
Alles anzeigen
Die SuDoKus haben folgende Form:
test.sudoku
EDIT://
Fehler behoben
EDIT://
Einrückung wiederhergestellt, scheint bei Editieren nicht erhalten zu bleiben ...

Jetzt wollte ich das ohne rekursion in Python angehen, das ganze funktioniert erst fast

sudoku.py
Quellcode
- #!/usr/bin/python
- # -*- coding: utf-8 -*-
- #Backtracking Algorithmus zum Lösen von SuDoKus
- #© Christoph Egger
- def print_actual(feld):
- for line in feld:
- for col in line:
- print col,
- print ""
- def read_sudoku(filename):
- feld = []
- f = file(filename, "r")
- data = f.read()
- tmp1 = data.splitlines()
- for a in tmp1:
- feld.append(a.split())
- return feld
- def test_colum(no, feld):
- found = []
- for n in feld:
- if n[no] != "0":
- if n[no] not in found:
- found.append(n[no])
- else:
- return False
- return True
- def test_row(no, feld):
- found = []
- for n in feld[no]:
- if n != "0":
- if n not in found:
- found.append(n)
- else:
- return False
- return True
- def test_quad(qcol, qrow, feld):
- found = []
- for trow in feld[(qrow*3):((qrow*3)+3)]:
- for tcol in trow[(qcol*3):((qcol*3)+3)]:
- if tcol != "0":
- if tcol not in found:
- found.append(tcol)
- else:
- return False
- return True
- def find_next_empty(feld):
- for a in feld:
- for b in a:
- if b == "0":
- return (feld.index(a), a.index(b))
- return (-1, -1)
- def solve_sudoku(feld):
- stack = []
- solutions = []
- start = 1
- while True:
- pos = find_next_empty(feld)
- if pos[0] == -1:
- solutions.append(feld)
- print "Lösung gefunden: "
- print_actual(feld)
- print " "
- if len(stack):
- tmp = stack.pop()
- feld[tmp[0][0]][tmp[0][1]] = "0"
- start = tmp[1] + 1
- else:
- return solutions
- else:
- for num in range(start, 10):
- feld[pos[0]][pos[1]] = str(num)
- if not test_colum(pos[1], feld):
- feld[pos[0]][pos[1]] = "0"
- continue
- if not test_row(pos[0], feld):
- feld[pos[0]][pos[1]] = "0"
- continue
- if not test_quad(pos[1]/3, pos[0]/3, feld):
- feld[pos[0]][pos[1]] = "0"
- continue
- stack.append((pos, num))
- start = 1
- break
- else:
- if len(stack):
- tmp = stack.pop()
- feld[tmp[0][0]][tmp[0][1]] = "0"
- start = tmp[1] + 1
- else:
- return solutions
start_sudoku.py
Quellcode
- #!/usr/bin/python
- # -*- coding: utf-8 -*-
- #Startet den Backtracker zum Lösen des Sudokus
- #© Christoph Egger
- import sudoku
- import sys
- if len(sys.argv) == 1:
- print "Der Script erwartet den Dateinamen des zu lösenden SuDoKus als Argument"
- else:
- feld = sudoku.read_sudoku(sys.argv[1])
- sudoku.print_actual(feld)
- print type(feld[0][0])
- print ""
- res = sudoku.solve_sudoku(feld)
- if len(res) > 1:
- print "Das SuSoKu ist mehrdeutig!"
- print "es existieren", len(res), "Lösungen!"
- elif len(res) == 0:
- print "Das SuDoKu besitzt keine Lösung!"
- else:
- print "Das SuDoKu ist eindeutig lösbar!"
Die SuDoKus haben folgende Form:
test.sudoku
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
Download meines ersten Spiels:HIER
Über Feedback würde ich mich freuen

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