diff --git a/sudoku.py b/sudoku.py new file mode 100644 index 0000000..8ac5ada --- /dev/null +++ b/sudoku.py @@ -0,0 +1,69 @@ +import time + +# Das Sudoku-Startfeld +start = [ + [0, 8, 0, 0, 2, 0, 5, 6, 0], + [0, 0, 0, 1, 0, 0, 0, 0, 7], + [0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 5, 0, 0, 9, 0, 4, 0, 8], + [0, 0, 7, 8, 0, 0, 0, 0, 3], + [0, 9, 0, 0, 1, 0, 0, 5, 0], + [2, 0, 4, 0, 0, 0, 8, 0, 0], + [0, 6, 0, 0, 8, 5, 0, 0, 0], + [0, 0, 0, 2, 0, 0, 1, 0, 0] +] + +def isfine(feld, x, y): + # Doppelte Zahl in Zeile oder Spalte prüfen + for yi in range(9): + if yi != y and feld[x][yi] == feld[x][y]: + return False + for xi in range(9): + if xi != x and feld[xi][y] == feld[x][y]: + return False + + # Neuner-Kästchen-Test + x1 = (x // 3) * 3 + y1 = (y // 3) * 3 + for xk in range(x1, x1 + 3): + for yk in range(y1, y1 + 3): + if (xk != x or yk != y) and feld[xk][yk] == feld[x][y]: + return False + + return True + +def nextone(feld, x, y): + if y == 9: + y = 0 + x += 1 + if x == 9: + return True + + if feld[x][y] > 0: + if not isfine(feld, x, y): + return False + return nextone(feld, x, y + 1) + else: + for feld[x][y] in range(1, 10): + if not isfine(feld, x, y): + continue + if nextone(feld, x, y + 1): + return True + feld[x][y] = 0 + return False + +def main(): + tstart = time.time() + + if nextone(start, 0, 0): + for row in start: + print(row) + else: + print("Nope!") + + time1 = time.time() + print(f"{tstart} - {time1} * {time.CLOCKS_PER_SEC}") + +if __name__ == "__main__": + main() +