Pozorně si prostudujte tento kód a objevte chytrý způsob, jak využít rekurzi k vyřešení těchto záludných sudoku.

Sudoku je populární číselná hádanka, která se skládá z mřížky 9x9 s číslicemi od 1 do 9. Puzzle obsahuje kombinaci čísel a pár prázdných míst, která musíte vyplnit.

Při vyplňování prázdných míst by každý řádek, sloupec a dílčí mřížka 3x3 měla obsahovat všechny číslice od 1 do 9.

Jednoduchý skript Python vám může pomoci vyřešit hádanku Sudoku. Dokáže analyzovat všechna prázdná místa na šachovnici sudoku a najít možné číslo k vyplnění každého prázdného místa.

Jak vytvořit a zobrazit nástěnku sudoku

Uvnitř skriptu Python budete muset použít seznam polí k uložení hodnot nevyřešeného sudoku.

Kód použitý v tomto projektu je k dispozici zde úložiště GitHub pod licencí MIT.

  1. Uvnitř nového skriptu Pythonu s názvem sudoku.py uložte všechny hodnoty pro mřížku 9x9. Každý řádek a sloupec představuje devět čísel napříč a dolů sudoku. Přidejte 0, které představují prostory, které je třeba vyřešit:
    instagram viewer
    deska = [
    [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. Uvnitř nové funkce nazvané print_board, použijte smyčku for zpracovat každý řádek v mřížce:
    defprint_board(deska):
    pro řádek v rozsah(9):
  3. Chcete-li každý řádek rozdělit na třetiny, zkontrolujte, zda je řádek dělitelný třemi, a přidejte řádek:
    -li řádek % 3 == 0a řada != 0:
    tisk("- - - - - - - - - - - - - - ")
  4. V každém řádku procházejte každý sloupec. Sloupce můžete také rozdělit na třetiny tak, že zkontrolujete, zda je sloupec dělitelný třemi:
    pro kol v rozsah(9):
    -li sloupec % 3 == 0a col != 0:
    tisk(" | ", konec="")
  5. Vytiskněte číselnou hodnotu uloženou v mřížce. Pokud je sloupec posledním sloupcem pro daný řádek, přidejte zalomený řádek, aby se následující řádek objevil na novém řádku:
    -li col == 8:
    tisknout (tabule[řádek][sloupec])
    jiný:
    tisknout (str (board[řádek][sloupec]) + " ", konec="")
  6. Zavolejte funkci pro tisk desky:
    print_board (board)
  7. V příkazovém řádku přejděte do složky, do které jste uložili skript python, například:
    cd Desktop
  8. Ke spuštění skriptu Sudoku použijte příkaz python. Podívejte se na puzzle vytištěné na obrazovce:
    python sudoku.py

Jak identifikovat prázdná místa k vyřešení

Můžete procházet seznamy a najít mezery, které se skládají z 0s. Ty určují, které prostory je potřeba vyřešit.

  1. V nové funkci nazvané find_empty() procházejte každý řádek a sloupec na desce:
    defnajít_prázdný(deska):
    pro řádek v rozsah(9):
    pro kol v rozsah(9):
  2. Pokud je hodnota aktuální buňky 0, vraťte aktuální pozici prázdné buňky:
    -li deska[řádek][sloupec] == 0:
    vrátit se (řádek, sloupec)
  3. Pokud skript dosáhne konce funkce, znamená to, že skript nenašel žádné buňky s hodnotou 0. V tomto případě nic nevracejte:
    vrátit seŽádný
  4. V nové funkci nazvané solve() použijte funkci find k nalezení prvního prázdného místa na desce:
    defřešit(deska):
    find = find_empty (board)
  5. Funkce find_empty() vrací pozici buňky ve formátu n-tice, například (0, 2). Tyto hodnoty uložte samostatně do řádek a kol proměnné. V opačném případě vraťte hodnotu true, což znamená, že nezbývají žádná prázdná místa k vyřešení:
    -line nalézt:
    vrátit seSkutečný
    jiný:
    řádek, col = najít

Jak vyřešit hádanku pro každý řádek, sloupec a mřížku 3x3

Nyní, když můžete identifikovat první prázdné místo k vyřešení, budete muset zkusit najít vhodné číslo, které zaplní toto místo a vyřeší hádanku.

Pomocí rekurze, zavolejte v sobě funkci solve() a vyzkoušejte všechny možné kombinace hodnot i pro všechny ostatní prostory.

  1. Uvnitř funkce solve() po nalezení prvního prázdného místa procházejte každé číslo od 1 do 9. Tato čísla představují možná čísla, která by mohla vyplnit nevyřešený prostor:
    pro č v rozsah(1, 10):
  2. Zadejte desku, možné číslo a pozici prázdné buňky do nové funkce. Nová funkce vrátí hodnotu true, pokud je toto číslo platné číslo, které může vyřešit toto prázdné místo. Pokud je platné, přidělte toto číslo buňce na tabuli:
    -li is_valid (tabulka, číslo, (řádek, sloupec)):
    deska[řádek][sloupec] = num
  3. Vytvořte funkci is_valid() s odpovídajícími parametry:
    defje platná(deska, číslo, pozice):
  4. Pomocí této funkce zkontrolujte, zda umístění čísla na tuto pozici neporušuje nějaká pravidla hry Sudoku. Nejprve zkontrolujte, zda toto číslo již existuje v řádku nebo sloupci buňky:
    pro kol v rozsah(9):
    -li deska[pos[0]][col] == num a poz [1] != col:
    vrátit seNepravdivé

    pro řádek v rozsah(9):
    -li deska[řádek][pos[1]] == num a poz [0] != řádek:
    vrátit seNepravdivé

  5. Získejte mřížku 3x3, do které buňka patří. Můžete to udělat vydělením pozice buňky třemi:
     box_row = pozice[0] // 3
    box_col = pozice[1] // 3
  6. U každého řádku a sloupce v této mřížce 3x3 zkontrolujte, zda číslo již existuje. Pokud ano, vraťte false:
    pro řádek v rozsah (box_row*3, pole_řádek*3 + 3):
    pro kol v rozsah (box_col*3, kolonka*3 + 3):
    -li deska[řádek][sloupec] == num a (řádek, sloupec) != pos:
    vrátit seNepravdivé
  7. Pokud skript dosáhne konce funkce, znamená to, že žádné z pravidel sudoku selhalo. Vrátit true:
    vrátit seSkutečný
  8. Funkce is_valid() pouze kontroluje, zda je umístění čísla platné, ale to neznamená, že je to správná odpověď na celkové řešení. V rámci funkce solve() zavolejte funkci solve() znovu s aktualizovanou deskou. Funkce solve() může dosáhnout stavu, kdy již nemůže používat žádná čísla k vyplnění mezer. V tomto případě celá funkce vrátí hodnotu false, resetuje danou buňku zpět na 0 a vrátí se zpět. Funkce solve() vrátí hodnotu true pouze tehdy, když skript může vyplnit všechny mezery:
    pro č v rozsah(1, 10):
    -li is_valid (tabulka, číslo, (řádek, sloupec)):
    deska[řádek][sloupec] = num

    -li vyřešit (deska):
    vrátit seSkutečný

    deska[řádek][sloupec] = 0

    vrátit seNepravdivé

  9. Chcete-li začít řešit hádanku, zavolejte funkci solve() s původní tabulí ve spodní části skriptu po deklaraci funkce solve():
    vyřešit (deska)
  10. Vytiskněte konečný výsledek:
    tisk("Vyřešeno:")
    print_board (board)
  11. Na příkazovém řádku použijte příkaz python k opětovnému spuštění skriptu. Prohlédněte si vyřešenou hádanku vytištěnou na obrazovce:
    python sudoku.py

Vytváření her pomocí Pythonu

Sudoku je jen jednou z mnoha her, které můžete vytvořit a vyřešit pomocí Pythonu. Python můžete použít k vytváření různých dalších her, jako je slovní změť, textová adventura nebo barevná hra, abychom jmenovali alespoň některé.