Uważnie przestudiuj ten kod i odkryj sprytny sposób wykorzystania rekurencji do rozwiązywania trudnych łamigłówek sudoku.

Sudoku to popularna łamigłówka liczbowa, która składa się z siatki 9x9 z cyframi od 1 do 9. Układanka zawiera kombinację liczb i kilka pustych miejsc, które musisz wypełnić.

Podczas wypełniania pustych miejsc każdy wiersz, kolumna i podsiatka 3x3 powinny zawierać wszystkie cyfry od 1 do 9.

Prosty skrypt w Pythonie może pomóc Ci rozwiązać łamigłówkę Sudoku. Może analizować wszystkie puste miejsca na planszy Sudoku i znaleźć możliwą liczbę do wypełnienia w każdym pustym miejscu.

Jak stworzyć i wyświetlić planszę Sudoku

Wewnątrz skryptu Pythona będziesz musiał użyć listy tablic do przechowywania wartości nierozwiązanej łamigłówki Sudoku.

Kod użyty w tym projekcie jest dostępny w this Repozytorium GitHub na licencji MIT.

  1. Wewnątrz nowego skryptu Pythona o nazwie sudoku.py przechowuj wszystkie wartości dla siatki 9x9. Każdy wiersz i kolumna reprezentuje dziewięć liczb w poprzek układanki Sudoku. Dodaj 0, aby reprezentować przestrzenie, które wymagają rozwiązania:
    tablica = [
    [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. Wewnątrz nowej funkcji o nazwie print_board, użyj pętli for aby przetworzyć każdy wiersz w siatce:
    pokdruk_tablica(tablica):
    Do wiersz W zakres(9):
  3. Aby podzielić każdy wiersz na trzy części, sprawdź, czy wiersz jest podzielny przez trzy, i dodaj linię:
    Jeśli wiersz % 3 == 0I wiersz != 0:
    wydrukować("- - - - - - - - - - - - - - ")
  4. W każdym rzędzie przejdź przez każdą kolumnę. Możesz także podzielić kolumny na trzy części, sprawdzając, czy kolumna jest podzielna przez trzy:
    Do przełęcz W zakres(9):
    Jeśli % kol. 3 == 0I kol. != 0:
    wydrukować(" | ", koniec="")
  5. Wydrukuj wartość liczbową zapisaną w siatce. Jeśli kolumna jest ostatnią kolumną dla tego konkretnego wiersza, dodaj linię podziału, tak aby następujący wiersz pojawił się w nowym wierszu:
    Jeśli kol == 8:
    drukuj (tablica[wiersz][kolumna])
    w przeciwnym razie:
    print(str (tablica[wiersz][kolumna]) + " ", koniec="")
  6. Wywołaj funkcję, aby wydrukować planszę:
    print_board (tablica)
  7. W wierszu poleceń przejdź do folderu, w którym zapisałeś skrypt Pythona, na przykład:
    cd Pulpit
  8. Użyj polecenia python, aby uruchomić skrypt Sudoku. Zobacz układankę wydrukowaną na ekranie:
    python sudoku.py

Jak zidentyfikować puste przestrzenie do rozwiązania

Możesz przeglądać listy, aby znaleźć spacje składające się z zer. Określają one, które przestrzenie wymagały rozwiązania.

  1. W nowej funkcji o nazwie find_empty() wykonaj pętlę w każdym wierszu i kolumnie na tablicy:
    pokznajdź_pusty(tablica):
    Do wiersz W zakres(9):
    Do przełęcz W zakres(9):
  2. Jeśli wartość bieżącej komórki wynosi 0, zwróć bieżącą pozycję pustej komórki:
    Jeśli tablica[wiersz][kolumna] == 0:
    powrót (wiersz, kol.)
  3. Jeśli skrypt dotrze do końca funkcji, oznacza to, że skrypt nie mógł znaleźć żadnych komórek o wartości 0. W takim przypadku nie zwracaj niczego:
    powrótNic
  4. W nowej funkcji o nazwie solve() użyj funkcji find, aby znaleźć pierwsze puste miejsce na tablicy:
    pokrozwiązywać(tablica):
    znajdź = znajdź_pusty (tablica)
  5. Funkcja find_empty() zwraca pozycję komórki w formacie krotki, na przykład (0, 2). Zapisz te wartości oddzielnie w pliku wiersz I przełęcz zmienne. W przeciwnym razie zwróć true, aby zaznaczyć, że nie ma już pustych miejsc do rozwiązania:
    Jeślinie znajdować:
    powrótPRAWDA
    w przeciwnym razie:
    wiersz, kolumna = znajdź

Jak rozwiązać zagadkę dla każdego wiersza, kolumny i siatki 3x3

Teraz, gdy możesz zidentyfikować pierwsze puste miejsce do rozwiązania, musisz spróbować znaleźć odpowiednią liczbę, aby wypełnić to miejsce i rozwiązać zagadkę.

Korzystanie z rekurencji, wywołaj funkcję solve() w sobie, aby wypróbować każdą możliwą kombinację wartości również dla wszystkich innych spacji.

  1. Wewnątrz funkcji solve(), po znalezieniu pierwszego pustego miejsca, przejdź przez każdą liczbę od 1 do 9. Liczby te reprezentują możliwe liczby, które mogłyby wypełnić nierozwiązaną przestrzeń:
    Do liczba W zakres(1, 10):
  2. Wprowadź tablicę, możliwą liczbę i pozycję pustej komórki do nowej funkcji. Nowa funkcja zwróci wartość true, jeśli ta liczba jest prawidłową liczbą, która może rozwiązać tę pustą przestrzeń. Jeśli jest ważny, przypisz ten numer do komórki na tablicy:
    Jeśli is_valid (tablica, liczba, (wiersz, kolumna)):
    tablica[wiersz][kolumna] = liczba
  3. Utwórz funkcję is_valid() z pasującymi parametrami:
    pokjest ważna(tablica, numer, poz):
  4. Skorzystaj z funkcji, aby sprawdzić, czy umieszczenie liczby w tej pozycji nie narusza zasad gry Sudoku. Najpierw sprawdź, czy ta liczba już istnieje w wierszu lub kolumnie komórki:
    Do przełęcz W zakres(9):
    Jeśli tablica[pozycja[0]][kolumna] == liczba I poz[1] != kol:
    powrótFAŁSZ

    Do wiersz W zakres(9):
    Jeśli tablica[wiersz][pozycja[1]] == liczba I poz[0] != wiersz:
    powrótFAŁSZ

  5. Pobierz siatkę 3x3, do której należy komórka. Możesz to zrobić, dzieląc pozycję komórki przez trzy:
     wiersz_pudełka = pozycja [0] // 3
    box_col = pozycja [1] // 3
  6. Dla każdego wiersza i kolumny w tej siatce 3x3 sprawdź, czy numer już istnieje. Jeśli tak, zwróć fałsz:
    Do wiersz W zakres (box_row*3, rząd_ramki*3 + 3):
    Do przełęcz W zakres (box_col*3, pudełko_kol*3 + 3):
    Jeśli tablica[wiersz][kolumna] == liczba I (wiersz, kolumna) != pozycja:
    powrótFAŁSZ
  7. Jeśli skrypt osiągnie koniec funkcji, oznacza to, że żadna z reguł Sudoku nie zawiodła. Zwróć prawdę:
    powrótPRAWDA
  8. Funkcja is_valid() sprawdza tylko, czy umieszczenie liczby jest prawidłowe, ale nie oznacza to, że jest to poprawna odpowiedź na całe rozwiązanie. W ramach funkcji solve() ponownie wywołaj funkcję solve() ze zaktualizowaną tablicą. Funkcja solve() może osiągnąć stan, w którym nie może już używać żadnych liczb do wypełniania spacji. W takim przypadku cała funkcja zwraca wartość false, resetuje tę konkretną komórkę z powrotem do wartości 0 i cofa się. Funkcja solve() zwraca wartość true tylko wtedy, gdy skrypt może wypełnić wszystkie spacje:
    Do liczba W zakres(1, 10):
    Jeśli is_valid (tablica, liczba, (wiersz, kolumna)):
    tablica[wiersz][kolumna] = liczba

    Jeśli rozwiązywać (tablica):
    powrótPRAWDA

    tablica[wiersz][kolumna] = 0

    powrótFAŁSZ

  9. Aby rozpocząć rozwiązywanie zagadki, wywołaj funkcję solve() z oryginalną planszą na dole skryptu, po zadeklarowaniu funkcji solve():
    rozwiązać (tablica)
  10. Wydrukuj wynik końcowy:
    wydrukować("Rozwiązany:")
    print_board (tablica)
  11. W wierszu poleceń użyj polecenia python, aby ponownie uruchomić skrypt. Zobacz rozwiązaną łamigłówkę wydrukowaną na ekranie:
    python sudoku.py

Tworzenie gier przy użyciu Pythona

Sudoku to tylko jedna z wielu gier, które możesz tworzyć i rozwiązywać za pomocą Pythona. Możesz używać Pythona do tworzenia różnych innych gier, takich jak zbieranie słów, tekstowa gra przygodowa lub gra w kolory, by wymienić tylko kilka.