Studieren Sie diesen Code sorgfältig und entdecken Sie einen cleveren Weg, Rekursion zu verwenden, um diese kniffligen Sudoku-Rätsel zu lösen.

Sudoku ist ein beliebtes Zahlenrätsel, das aus einem 9x9-Raster mit Ziffern von 1 bis 9 besteht. Das Puzzle enthält eine Zahlenkombination und einige Leerstellen, die Sie ausfüllen müssen.

Beim Ausfüllen der leeren Felder sollte jede Zeile, Spalte und jedes 3x3-Unterraster alle Ziffern von 1 bis 9 enthalten.

Ein einfaches Python-Skript kann Ihnen helfen, ein Sudoku-Rätsel zu lösen. Es kann alle leeren Felder auf dem Sudoku-Brett analysieren und eine mögliche Zahl finden, um jedes leere Feld zu füllen.

So erstellen und zeigen Sie das Sudoku-Board an

In einem Python-Skript müssen Sie eine Liste von Arrays verwenden, um die Werte des ungelösten Sudoku-Rätsels zu speichern.

Der in diesem Projekt verwendete Code ist in diesem verfügbar GitHub-Repository unter der MIT-Lizenz.

  1. Speichern Sie in einem neuen Python-Skript namens sudoku.py alle Werte für das 9x9-Raster. Jede Reihe und Spalte repräsentiert die neun Zahlen quer und runter im Sudoku-Rätsel. Fügen Sie Nullen hinzu, um die Räume darzustellen, die gelöst werden müssen:
    Brett = [
    [5, 3, 0, 0, 7, 0, 0, 0, 0],
    [6, 0, 0, 1, 9, 5, 0, 0, 0],
    [0, 9, 8, 0, 0, 0, 0, 6, 0],
    [8, 0, 0, 0, 6, 0, 0, 0, 3],
    [4, 0, 0, 8, 0, 3, 0, 0, 1],
    [7, 0, 0, 0, 2, 0, 0, 0, 6],
    [0, 6, 0, 0, 0, 0, 2, 8, 0],
    [0, 0, 0, 4, 1, 9, 0, 0, 5],
    [0, 0, 0, 0, 8, 0, 0, 7, 9]
    ]
  2. Innerhalb einer neuen Funktion namens print_board, verwende eine for-Schleife So verarbeiten Sie jede Zeile im Raster:
    defprint_board(Planke):
    für Reihe In Bereich(9):
  3. Um jede Zeile in Drittel zu unterteilen, überprüfen Sie, ob die Zeile durch drei teilbar ist, und fügen Sie eine Zeile hinzu:
    Wenn Reihe % 3 == 0Und Zeile != 0:
    drucken("- - - - - - - - - - - - - - ")
  4. Schleife innerhalb jeder Zeile durch jede Spalte. Sie können Spalten auch in Drittel teilen, indem Sie überprüfen, ob die Spalte durch drei teilbar ist:
    für Kol In Bereich(9):
    Wenn Spalte % 3 == 0Und Spalte != 0:
    drucken(" | ", Ende="")
  5. Drucken Sie den im Raster gespeicherten Zahlenwert. Wenn die Spalte die letzte Spalte für diese bestimmte Zeile ist, fügen Sie eine Umbruchlinie hinzu, sodass die folgende Zeile in einer neuen Zeile erscheint:
    Wenn Spalte == 8:
    print (board[row][col])
    anders:
    print (str (board[row][col]) + " ", Ende="")
  6. Rufen Sie die Funktion zum Drucken der Platine auf:
    print_board (Tafel)
  7. Navigieren Sie in einer Befehlszeile zu dem Ordner, in dem Sie Ihr Python-Skript gespeichert haben, zum Beispiel:
    CD-Desktop
  8. Verwenden Sie den Python-Befehl, um Ihr Sudoku-Skript auszuführen. Sehen Sie sich das auf dem Bildschirm gedruckte Puzzle an:
    python-sudoku.py

So identifizieren Sie die zu lösenden leeren Räume

Sie können die Listen durchgehen, um die Leerzeichen zu finden, die aus Nullen bestehen. Diese bestimmen, welche Räume gelöst werden müssen.

  1. Durchlaufen Sie in einer neuen Funktion namens find_empty() jede Zeile und Spalte auf der Tafel:
    deffind_empty(Planke):
    für Reihe In Bereich(9):
    für Kol In Bereich(9):
  2. Wenn der Wert der aktuellen Zelle 0 ist, geben Sie die aktuelle Position der leeren Zelle zurück:
    Wenn Brett[Zeile][Spalte] == 0:
    zurückkehren (Zeile, Spalte)
  3. Wenn das Skript das Ende der Funktion erreicht, bedeutet dies, dass das Skript keine Zellen mit dem Wert 0 finden konnte. Geben Sie in diesem Fall nichts zurück:
    zurückkehrenKeiner
  4. Verwenden Sie in einer neuen Funktion namens solve() die find-Funktion, um das erste leere Feld auf der Tafel zu finden:
    deflösen(Planke):
    find = find_empty (Brett)
  5. Die Funktion find_empty() gibt die Zellenposition im Tupelformat zurück, zum Beispiel (0, 2). Speichern Sie diese Werte separat in der Reihe Und Kol Variablen. Geben Sie andernfalls true zurück, um anzugeben, dass keine leeren Felder mehr zu lösen sind:
    Wennnicht finden:
    zurückkehrenWAHR
    anders:
    Zeile, Spalte = finden

So lösen Sie das Puzzle für jede Zeile, Spalte und jedes 3x3-Raster

Jetzt, da Sie das erste leere Feld identifizieren können, das Sie lösen müssen, müssen Sie versuchen, eine geeignete Zahl zu finden, um dieses Feld zu füllen und das Rätsel zu lösen.

Rekursion verwenden, rufen Sie die Funktion solve() in sich selbst auf, um jede mögliche Kombination von Werten auch für alle anderen Räume auszuprobieren.

  1. Nachdem Sie das erste Leerzeichen gefunden haben, durchlaufen Sie innerhalb der Funktion solve() jede Zahl von 1 bis 9. Diese Zahlen stellen die möglichen Zahlen dar, die den ungelösten Raum füllen könnten:
    für Anzahl In Bereich(1, 10):
  2. Geben Sie das Brett, die mögliche Nummer und die Position der leeren Zelle in eine neue Funktion ein. Die neue Funktion gibt wahr zurück, wenn diese Zahl eine gültige Zahl ist, die diesen leeren Raum lösen kann. Wenn es gültig ist, weisen Sie diese Nummer der Zelle auf der Tafel zu:
    Wenn is_valid (board, num, (row, col)):
    board[row][col] = num
  3. Erstellen Sie die Funktion is_valid() mit übereinstimmenden Parametern:
    defist gültig(Board, Num, Pos):
  4. Verwenden Sie die Funktion, um zu überprüfen, ob das Platzieren der Zahl an dieser Position gegen die Regeln des Sudoku-Spiels verstößt. Überprüfen Sie zunächst, ob diese Nummer bereits in der Zeile oder Spalte der Zelle vorhanden ist:
    für Kol In Bereich(9):
    Wenn Brett0]][Spalte] == Anz Und Pos[1] != Spalte:
    zurückkehrenFALSCH

    für Reihe In Bereich(9):
    Wenn Brett[Zeile][Pos[1]] == Anz Und Pos[0] != Zeile:
    zurückkehrenFALSCH

  5. Holen Sie sich das 3x3-Raster, zu dem die Zelle gehört. Sie können dies tun, indem Sie die Position der Zelle durch drei teilen:
     box_row = pos[0] // 3
    box_col = pos[1] // 3
  6. Überprüfen Sie für jede Zeile und Spalte in diesem 3x3-Raster, ob die Zahl bereits existiert. Wenn dies der Fall ist, geben Sie false zurück:
    für Reihe In Bereich (box_row*3, box_row*3 + 3):
    für Kol In Bereich (box_col*3, box_col*3 + 3):
    Wenn board[row][col] == num Und (Zeile, Spalte) != Pos:
    zurückkehrenFALSCH
  7. Wenn das Skript das Ende der Funktion erreicht, bedeutet dies, dass keine der Sudoku-Regeln fehlgeschlagen ist. Rückgabe wahr:
    zurückkehrenWAHR
  8. Die Funktion is_valid() prüft nur, ob die Zahlenplatzierung gültig ist, aber das bedeutet nicht, dass es die richtige Antwort auf die Gesamtlösung ist. Rufen Sie innerhalb der Funktion solve() die Funktion solve() mit dem aktualisierten Board erneut auf. Die Funktion solve() kann einen Zustand erreichen, in dem sie keine Zahlen mehr verwenden kann, um Leerzeichen zu füllen. In diesem Fall gibt die gesamte Funktion falsch zurück, setzt diese bestimmte Zelle auf 0 zurück und geht zurück. Die Funktion solve() gibt nur dann true zurück, wenn das Skript alle Leerzeichen füllen kann:
    für Anzahl In Bereich(1, 10):
    Wenn is_valid (board, num, (row, col)):
    board[row][col] = num

    Wenn lösen (Brett):
    zurückkehrenWAHR

    board[row][col] = 0

    zurückkehrenFALSCH

  9. Um mit dem Lösen des Rätsels zu beginnen, rufen Sie die Funktion solve() mit dem ursprünglichen Board am Ende des Skripts auf, nachdem Sie die Funktion solve() deklariert haben:
    lösen (Brett)
  10. Drucken Sie das Endergebnis aus:
    drucken("Gelöst:")
    print_board (Tafel)
  11. Verwenden Sie in der Befehlszeile den Python-Befehl, um das Skript erneut auszuführen. Sehen Sie sich das gelöste Rätsel auf dem Bildschirm an:
    python-sudoku.py

Spiele mit Python erstellen

Sudoku ist nur eines der vielen Spiele, die Sie mit Python erstellen und lösen können. Sie können Python verwenden, um verschiedene andere Spiele zu erstellen, z. B. ein Wortwirrwarr, ein textbasiertes Abenteuerspiel oder ein Farbspiel, um nur einige zu nennen.