Tanulmányozza alaposan ezt a kódot, és fedezze fel a rekurzió okos módját a trükkös sudoku rejtvények megoldására.

A Sudoku egy népszerű számrejtvény, amely egy 9x9-es rácsból áll, 1 és 9 közötti számjegyekkel. A puzzle számok kombinációját és néhány üres mezőt tartalmaz, amelyeket ki kell töltenie.

Az üres helyek kitöltésekor minden sornak, oszlopnak és 3x3-as részrácsnak tartalmaznia kell az összes számjegyet 1-től 9-ig.

Egy egyszerű Python-szkript segíthet megoldani egy Sudoku-rejtvényt. Képes elemezni a Sudoku táblán lévő összes üres helyet, és megtalálni egy lehetséges számot, amellyel minden üres helyet kitölthet.

A Sudoku tábla létrehozása és megjelenítése

A Python-szkripten belül tömblistát kell használnia a megoldatlan Sudoku-rejtvény értékeinek tárolásához.

A projektben használt kód itt érhető el GitHub repó az MIT engedélye alapján.

  1. A sudoku.py nevű új Python-szkriptben tárolja a 9x9-es rács összes értékét. Minden sor és oszlop a kilenc számot képviseli a Sudoku-rejtvényen keresztül és lefelé. Adjon hozzá 0-t a megoldásra váró terek jelölésére:
    instagram viewer
    tábla = [
    [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. A print_board nevű új függvényen belül, használj egy for ciklust a rács egyes sorainak feldolgozásához:
    defprint_board(tábla):
    számára sor ban ben hatótávolság(9):
  3. Az egyes sorok harmadokra bontásához ellenőrizze, hogy a sor osztható-e hárommal, és adjon hozzá egy sort:
    ha sor % 3 == 0és sor != 0:
    nyomtatás("- - - - - - - - - - - - - - ")
  4. Minden soron belül görgessen végig minden oszlopon. Az oszlopokat harmadokra is feloszthatja, ha ellenőrzi, hogy az oszlop osztható-e hárommal:
    számára col ban ben hatótávolság(9):
    ha oszlop % 3 == 0és col != 0:
    nyomtatás(" | ", vége="")
  5. Nyomtassa ki a rácsban tárolt számértéket. Ha az oszlop az adott sor utolsó oszlopa, adjon hozzá egy törésvonalat, hogy a következő sor jelenjen meg egy új sorban:
    ha col == 8:
    nyomtatás (tábla[sor][col])
    más:
    print (str (tábla[sor][col]) + " ", vége="")
  6. Hívja a függvényt a tábla nyomtatásához:
    print_board (tábla)
  7. A parancssorban keresse meg azt a mappát, ahol a python-szkriptet tárolta, például:
    cd asztali
  8. Használja a python parancsot a Sudoku-szkript futtatásához. Tekintse meg a képernyőre nyomtatott rejtvényt:
    python sudoku.py

Hogyan lehet azonosítani a megoldandó üres tereket

A listákon végighaladva megkeresheti a 0-kból álló szóközöket. Ezek határozzák meg, hogy mely tereket kell megoldani.

  1. A find_empty() nevű új függvényben görgessen végig a tábla minden során és oszlopán:
    deffind_empty(tábla):
    számára sor ban ben hatótávolság(9):
    számára col ban ben hatótávolság(9):
  2. Ha az aktuális cella értéke 0, adja vissza az üres cella aktuális pozícióját:
    ha tábla[sor][col] == 0:
    Visszatérés (sor, oszlop)
  3. Ha a szkript eléri a függvény végét, az azt jelenti, hogy a szkript nem talált 0 értékű cellát. Ebben az esetben ne küldjön vissza semmit:
    VisszatérésEgyik sem
  4. A solve() nevű új függvényben használja a find függvényt a tábla első üres helyének megkereséséhez:
    defmegoldani(tábla):
    find = find_empty (tábla)
  5. A find_empty() függvény a cella pozícióját sorformátumban adja vissza, például (0, 2). Mentse ezeket az értékeket külön a sor és col változók. Ellenkező esetben adja vissza a true értéket, jelezve, hogy nem maradt üres hely a megoldásra:
    hanem megtalálja:
    VisszatérésIgaz
    más:
    sor, oszlop = talál

Hogyan oldjuk meg a rejtvényt minden sorhoz, oszlophoz és 3x3-as rácshoz

Most, hogy megtaláltad az első megfejtendő üres mezőt, meg kell találnod a megfelelő számot a mező kitöltéséhez és a rejtvény megfejtéséhez.

Rekurzió használata, hívja meg magában a solve() függvényt, hogy minden lehetséges értékkombinációt kipróbáljon az összes többi térben is.

  1. A solve() függvényen belül, miután megtalálta az első üres helyet, léptessen végig az egyes számokat 1-től 9-ig. Ezek a számok jelentik azokat a lehetséges számokat, amelyek kitölthetik a megoldatlan helyet:
    számára sz ban ben hatótávolság(1, 10):
  2. Írja be a táblát, a lehetséges számot és az üres cella pozícióját egy új függvénybe. Az új függvény igazat ad vissza, ha ez a szám olyan érvényes szám, amely képes megoldani az üres helyet. Ha érvényes, rendelje hozzá ezt a számot a tábla cellájához:
    ha is_valid (tábla, szám, (sor, oszlop)):
    tábla[sor][col] = szm
  3. Hozza létre az is_valid() függvényt a megfelelő paraméterekkel:
    deférvényes(tábla, szám, poz.):
  4. Használja a funkciót annak ellenőrzésére, hogy a szám adott pozícióba helyezése sérti-e a Sudoku játék szabályait. Először ellenőrizze, hogy ez a szám létezik-e már a cella sorában vagy oszlopában:
    számára col ban ben hatótávolság(9):
    ha board[pos[0]][col] == szm és pozíció[1] != oszlop:
    VisszatérésHamis

    számára sor ban ben hatótávolság(9):
    ha board[row][poz[1]] == sz és pozíció[0] != sor:
    VisszatérésHamis

  5. Szerezd meg azt a 3x3-as rácsot, amelyhez a cella tartozik. Ezt úgy teheti meg, hogy a cella pozícióját elosztja hárommal:
     box_row = poz[0] // 3
    box_col = poz[1] // 3
  6. A 3x3-as rács minden sorához és oszlopához ellenőrizze, hogy a szám létezik-e már. Ha igen, adja vissza hamis:
    számára sor ban ben tartomány (doboz_sor*3, box_row*3 + 3):
    számára col ban ben tartomány (box_col*3, box_col*3 + 3):
    ha tábla[sor][col] == sz és (sor, oszlop) != poz:
    VisszatérésHamis
  7. Ha a szkript eléri a függvény végét, az azt jelenti, hogy egyik Sudoku-szabály sem hibásodott meg. Igaz vissza:
    VisszatérésIgaz
  8. Az is_valid() függvény csak azt ellenőrzi, hogy a számelhelyezés érvényes-e, de ez nem jelenti azt, hogy ez a helyes válasz a teljes megoldásra. A solve() függvényen belül hívjuk meg újra a solve() függvényt a frissített táblával. A solve() függvény elérheti azt az állapotot, hogy már nem tud semmilyen számot használni a szóközök kitöltésére. Ebben az esetben az egész függvény false értéket ad vissza, visszaállítja az adott cellát 0-ra, és visszalép. A solve() függvény csak akkor ad vissza igazat, ha a szkript minden helyet kitölt:
    számára sz ban ben hatótávolság(1, 10):
    ha is_valid (tábla, szám, (sor, oszlop)):
    tábla[sor][col] = szm

    ha megoldani (tábla):
    VisszatérésIgaz

    tábla[sor][oszlop] = 0

    VisszatérésHamis

  9. A rejtvény megfejtésének megkezdéséhez hívja meg a solve() függvényt az eredeti táblával, a szkript alján, a solve() függvény deklarálása után:
    megold (tábla)
  10. Nyomtassa ki a végeredményt:
    nyomtatás("Megoldva:")
    print_board (tábla)
  11. A parancssorban a python paranccsal futtassa újra a szkriptet. Tekintse meg a megoldott rejtvényt a képernyőre nyomtatva:
    python sudoku.py

Játékok létrehozása Python használatával

A Sudoku csak egy a Python segítségével létrehozható és megoldható játékok közül. A Python segítségével számos más játékot is létrehozhat, például szózavarokat, szöveges kalandjátékokat vagy színes játékokat, hogy csak néhányat említsünk.