Uzmanīgi izpētiet šo kodu un atklājiet gudru veidu, kā izmantot rekursiju, lai atrisinātu šīs sarežģītās sudoku mīklas.

Sudoku ir populāra skaitļu mīkla, kas sastāv no 9x9 režģa ar cipariem no 1 līdz 9. Puzlē ir skaitļu kombinācija un dažas tukšas vietas, kuras jums jāaizpilda.

Aizpildot tukšās vietas, katrā rindā, kolonnā un 3x3 apakšrežģī ir jābūt visiem cipariem no 1 līdz 9.

Vienkāršs Python skripts var palīdzēt atrisināt Sudoku mīklu jūsu vietā. Tas var analizēt visas tukšās vietas uz Sudoku tāfeles un atrast iespējamo numuru, kas jāaizpilda katrā tukšajā vietā.

Kā izveidot un parādīt Sudoku dēli

Python skriptā jums būs jāizmanto masīvu saraksts, lai saglabātu neatrisinātās Sudoku mīklas vērtības.

Šajā projektā izmantotais kods ir pieejams šajā GitHub repo saskaņā ar MIT licenci.

  1. Jaunā Python skriptā ar nosaukumu sudoku.py saglabājiet visas 9x9 režģa vērtības. Katra rinda un kolonna apzīmē deviņus skaitļus pāri un uz leju Sudoku mīklā. Pievienojiet 0, lai attēlotu atrisināmās atstarpes:
    instagram viewer
    dēlis = [
    [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. Jaunā funkcijā print_board, izmantojiet for cilpu lai apstrādātu katru režģa rindu:
    defprint_board(dēlis):
    priekš rinda iekšā diapazons(9):
  3. Lai katru rindu sadalītu trešdaļās, pārbaudiet, vai rinda dalās ar trīs, un pievienojiet rindu:
    ja rinda % 3 == 0un rinda != 0:
    drukāt ("- - - - - - - - - - - - - - ")
  4. Katrā rindā veiciet cilpu cauri katrai kolonnai. Varat arī sadalīt kolonnas trešdaļās, pārbaudot, vai kolonna dalās ar trīs:
    priekš kol iekšā diapazons(9):
    ja kolonna % 3 == 0un col != 0:
    drukāt (" | ", beigas="")
  5. Izdrukājiet režģī saglabāto skaitļa vērtību. Ja kolonna ir konkrētās rindas pēdējā kolonna, pievienojiet pārtraukuma līniju, lai jaunā rindā tiktu parādīta šāda rinda:
    ja col == 8:
    drukāt (tāfele[rinda][kola])
    cits:
    drukāt (str (board[rinda][col]) + " ", beigas="")
  6. Izsauciet tāfeles drukāšanas funkciju:
    print_board (dēlis)
  7. Komandrindā pārejiet uz mapi, kurā saglabājāt python skriptu, piemēram:
    cd darbvirsma
  8. Izmantojiet python komandu, lai palaistu Sudoku skriptu. Skatiet uz ekrāna izdrukāto mīklu:
    python sudoku.py

Kā noteikt risināmās tukšās vietas

Varat pārvietoties pa sarakstiem, lai atrastu atstarpes, kas sastāv no 0. Tie nosaka, kuras telpas ir jāatrisina.

  1. Jaunā funkcijā ar nosaukumu find_empty() veiciet cilpu cauri katrai tāfeles rindai un kolonnai:
    defatrast_tukšs(dēlis):
    priekš rinda iekšā diapazons(9):
    priekš kol iekšā diapazons(9):
  2. Ja pašreizējās šūnas vērtība ir 0, atgrieziet tukšās šūnas pašreizējo pozīciju:
    ja dēlis[rinda][kolonna] == 0:
    atgriezties (rinda, kolonna)
  3. Ja skripts sasniedz funkcijas beigas, tas nozīmē, ka skripts nevarēja atrast nevienu šūnu ar vērtību 0. Šajā gadījumā neko neatgrieziet:
    atgrieztiesNav
  4. Jaunā funkcijā solve() izmantojiet Find funkciju, lai atrastu pirmo tukšo vietu uz tāfeles:
    defatrisināt(dēlis):
    atrast = atrast_tukšs (dēlis)
  5. Funkcija find_empty() atgriež šūnas pozīciju korešu formātā, piemēram, (0, 2). Saglabājiet šīs vērtības atsevišķi mapē rinda un kol mainīgie. Pretējā gadījumā atgrieziet patieso vērtību, lai norādītu, ka nav atlicis tukšas vietas, ko atrisināt:
    ja atrast:
    atgrieztiesTaisnība
    cits:
    rinda, kolonna = atrast

Kā atrisināt mīklu katrai rindai, kolonnai un 3x3 režģim

Tagad, kad varat noteikt pirmo tukšo vietu, kas jāatrisina, jums būs jāmēģina atrast atbilstošs skaitlis, lai aizpildītu šo vietu un atrisinātu mīklu.

Izmantojot rekursiju, izsauc sevī funkciju solve(), lai izmēģinātu visas iespējamās vērtību kombinācijas arī visām pārējām telpām.

  1. Funkcijā solve () pēc pirmās tukšās vietas atrašanas veiciet cilpu caur katru skaitli no 1 līdz 9. Šie skaitļi attēlo iespējamos skaitļus, kas varētu aizpildīt neatrisināto vietu:
    priekš num iekšā diapazons(1, 10):
  2. Ievadiet dēli, iespējamo numuru un tukšās šūnas pozīciju jaunā funkcijā. Jaunā funkcija atgriezīs patieso vērtību, ja šis skaitlis ir derīgs skaitlis, kas var atrisināt šo tukšo vietu. Ja tas ir derīgs, piešķiriet šo numuru tāfeles šūnai:
    ja is_valid (dēlis, skaits, (rinda, kolonna)):
    dēlis[rinda][kolonna] = num
  3. Izveidojiet funkciju is_valid() ar atbilstošiem parametriem:
    defir derīgs(dēlis, numurs, poz.):
  4. Izmantojiet šo funkciju, lai pārbaudītu, vai numura ievietošana šajā pozīcijā nepārkāpj kādus Sudoku spēles noteikumus. Vispirms pārbaudiet, vai šis numurs jau pastāv šūnas rindā vai kolonnā:
    priekš kol iekšā diapazons(9):
    ja dēlis[poz[0]][kolonna] == num un poz[1] != kolonna:
    atgrieztiesNepatiesi

    priekš rinda iekšā diapazons(9):
    ja dēlis[rinda][poz[1]] == num un poz[0] != rinda:
    atgrieztiesNepatiesi

  5. Iegūstiet 3x3 režģi, kuram pieder šūna. To var izdarīt, dalot šūnas pozīciju ar trīs:
     box_row = poz[0] // 3
    box_col = poz[1] // 3
  6. Katrai rindai un kolonnai šajā 3x3 režģī pārbaudiet, vai numurs jau pastāv. Ja tā notiek, atgrieziet false:
    priekš rinda iekšā diapazons (box_row*3, box_row*3 + 3):
    priekš kol iekšā diapazons (box_col*3, box_col*3 + 3):
    ja dēlis[rinda][kolonna] == num un (rinda, kolonna) != poz:
    atgrieztiesNepatiesi
  7. Ja skripts sasniedz funkcijas beigas, tas nozīmē, ka neviena no Sudoku kārtulām neizdevās. Atgriezt patieso:
    atgrieztiesTaisnība
  8. Funkcija is_valid() tikai pārbauda, ​​vai skaitļu izvietojums ir derīgs, taču tas nenozīmē, ka tā ir pareizā atbilde uz kopējo risinājumu. Funkcijā solve() vēlreiz izsauciet funkciju solve() ar atjaunināto paneli. Funkcija solve() var sasniegt stāvokli, kurā tā vairs nevar izmantot ciparus, lai aizpildītu atstarpes. Šajā gadījumā visa funkcija atgriež false, atiestata konkrēto šūnu atpakaļ uz 0 un atgriežas. Funkcija solve() atgriež patieso vērtību tikai tad, ja skripts var aizpildīt visas atstarpes:
    priekš num iekšā diapazons(1, 10):
    ja is_valid (dēlis, skaits, (rinda, kolonna)):
    dēlis[rinda][kolonna] = num

    ja atrisināt (dēlis):
    atgrieztiesTaisnība

    dēlis[rinda][kolonna] = 0

    atgrieztiesNepatiesi

  9. Lai sāktu risināt mīklu, izsauciet solve() funkciju ar oriģinālo dēli, skripta apakšā pēc solve() funkcijas deklarēšanas:
    atrisināt (dēlis)
  10. Izdrukājiet gala rezultātu:
    drukāt ("Atrisināts:")
    print_board (dēlis)
  11. Komandrindā izmantojiet komandu python, lai atkārtoti palaistu skriptu. Skatiet uz ekrāna izdrukāto atrisināto mīklu:
    python sudoku.py

Spēļu izveide, izmantojot Python

Sudoku ir tikai viena no daudzajām spēlēm, kuras varat izveidot un atrisināt, izmantojot Python. Varat izmantot Python, lai izveidotu dažādas citas spēles, piemēram, vārdu sajaukumu, teksta piedzīvojumu spēli vai krāsu spēli, lai nosauktu tikai dažas.