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.
- 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:
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]
] - 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): - 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("- - - - - - - - - - - - - - ") - 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="") - 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="") - Hívja a függvényt a tábla nyomtatásához:
print_board (tábla)
- A parancssorban keresse meg azt a mappát, ahol a python-szkriptet tárolta, például:
cd asztali
- 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.
- 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): - 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) - 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
- 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) - 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.
- 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):
- Í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 - Hozza létre az is_valid() függvényt a megfelelő paraméterekkel:
deférvényes(tábla, szám, poz.):
- 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ésHamisszámára sor ban ben hatótávolság(9):
ha board[row][poz[1]] == sz és pozíció[0] != sor:
VisszatérésHamis - 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 - 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 - 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
- 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] = 0VisszatérésHamis
- 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)
- Nyomtassa ki a végeredményt:
nyomtatás("Megoldva:")
print_board (tábla) - 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.