Tutki tätä koodia huolellisesti ja löydä näppärä tapa käyttää rekursiota näiden hankkien sudokupulmien ratkaisemiseen.

Sudoku on suosittu numeropulma, joka koostuu 9x9-ruudukosta, jossa on numeroita 1-9. Palapeli sisältää yhdistelmän numeroita ja joitakin tyhjiä kohtia, jotka sinun on täytettävä.

Kun täytät tyhjiä kohtia, jokaisen rivin, sarakkeen ja 3x3-aliruudukon tulee sisältää kaikki numerot 1-9.

Yksinkertainen Python-skripti voi auttaa ratkaisemaan Sudoku-pulman puolestasi. Se voi analysoida kaikki Sudoku-taulun tyhjät kohdat ja löytää mahdollisen numeron jokaiseen tyhjään tilaan.

Sudokutaulun luominen ja näyttäminen

Python-skriptin sisällä sinun on käytettävä taulukoita tallentaaksesi ratkaisemattoman Sudoku-pulman arvot.

Tässä projektissa käytetty koodi on saatavilla tästä GitHub repo MIT-lisenssillä.

  1. Tallenna kaikki 9x9-ruudukon arvot uuteen Python-skriptiin nimeltä sudoku.py. Jokainen rivi ja sarake edustavat yhdeksää numeroa Sudoku-pulman poikki ja alaspäin. Lisää nollia kuvaamaan välilyöntejä, jotka kaipaavat ratkaisemista:
    lauta = [
    [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. Uudessa print_board-toiminnossa, käytä for-silmukkaa ruudukon jokaisen rivin käsitteleminen:
    defprint_board(lauta):
    varten rivi sisään range(9):
  3. Erota jokainen rivi kolmasosiksi tarkistamalla, onko rivi jaollinen kolmella, ja lisää rivi:
    jos rivi % 3 == 0ja rivi! = 0:
    Tulosta("- - - - - - - - - - - - - - ")
  4. Selaa jokaisen rivin jokaisen sarakkeen läpi. Voit myös jakaa sarakkeet kolmasosiksi tarkistamalla, onko sarake jaollinen kolmella:
    varten kol sisään range(9):
    jos sarake % 3 == 0ja col != 0:
    Tulosta(" | ", loppu ="")
  5. Tulosta ruudukkoon tallennettu numeroarvo. Jos sarake on kyseisen rivin viimeinen sarake, lisää väliviiva, jotta seuraava rivi tulee näkyviin uudelle riville:
    jos sarake == 8:
    tulosta (taulu[rivi][sara])
    muu:
    tulosta (str (taulu[rivi][sara]) + " ", loppu ="")
  6. Kutsu toiminto taulun tulostamiseksi:
    print_board (taulu)
  7. Siirry komentorivillä kansioon, johon tallensit python-skripti, esimerkiksi:
    cd työpöytä
  8. Käytä python-komentoa Sudoku-skriptin suorittamiseen. Katso näytölle painettu palapeli:
    python sudoku.py

Kuinka tunnistaa tyhjät tilat ratkaistavaksi

Voit selata luetteloita löytääksesi välilyönnit, jotka koostuvat 0:sta. Nämä määrittelevät, mitkä tilat tarvitsevat ratkaisua.

  1. Uudessa funktiossa, jonka nimi on find_empty(), käy läpi jokaisen taulun rivin ja sarakkeen:
    defetsi_tyhjä(lauta):
    varten rivi sisään range(9):
    varten kol sisään range(9):
  2. Jos nykyisen solun arvo on 0, palauta tyhjän solun nykyinen sijainti:
    jos board[rivi][sara] == 0:
    palata (rivi, sarake)
  3. Jos komentosarja saavuttaa funktion lopun, komentosarja ei löytänyt yhtään solua, jonka arvo on 0. Älä tässä tapauksessa palauta mitään:
    palataEi mitään
  4. Uudessa funktiossa, jonka nimi on solve(), käytä Find-funktiota löytääksesi ensimmäisen tyhjän tilan laudalta:
    defratkaista(lauta):
    find = löydä_tyhjä (taulu)
  5. Find_empty()-funktio palauttaa solun sijainnin monikkomuodossa, esimerkiksi (0, 2). Tallenna nämä arvot erikseen rivi ja kol muuttujia. Muussa tapauksessa palauta tosi, mikä tarkoittaa, että tyhjiä tiloja ei ole jäljellä ratkaistavaksi:
    josei löytö:
    palataTotta
    muu:
    rivi, sarake = etsi

Jokaisen rivin, sarakkeen ja 3x3-ruudukon palapelin ratkaiseminen

Nyt kun voit tunnistaa ensimmäisen tyhjän tilan ratkaistavaksi, sinun on yritettävä löytää sopiva numero tilan täyttämiseksi ja palapelin ratkaisemiseksi.

Rekursion käyttö, kutsu itsessään solve()-funktiota kokeillakseen kaikkia mahdollisia arvoyhdistelmiä myös kaikille muille avaruuksille.

  1. Solida()-funktion sisällä, kun olet löytänyt ensimmäisen tyhjän tilan, kiertele jokaisen luvun välillä 1–9. Nämä luvut edustavat mahdollisia lukuja, jotka voisivat täyttää ratkaisemattoman tilan:
    varten nro sisään range(1, 10):
  2. Syötä taulu, mahdollinen numero ja tyhjän solun sijainti uuteen funktioon. Uusi funktio palauttaa tosi, jos tämä luku on kelvollinen luku, joka voi ratkaista tämän tyhjän tilan. Jos se on kelvollinen, määritä se taulun soluun:
    jos is_valid (taulu, numero, (rivi, sarake)):
    board[rivi][sara] = num
  3. Luo funktio is_valid() vastaavilla parametreilla:
    defon_valid(taulu, numero, pos.):
  4. Käytä toimintoa tarkistaaksesi, rikkooko numeron sijoittaminen tähän kohtaan Sudoku-pelin sääntöjä. Tarkista ensin, onko kyseinen numero jo solun rivillä tai sarakkeessa:
    varten kol sisään range(9):
    jos board[pos[0]][sarake] == num ja pos[1] != sarake:
    palataVäärä

    varten rivi sisään range(9):
    jos board[row][pos[1]] == num ja pos[0] != rivi:
    palataVäärä

  5. Hanki 3x3-ruudukko, johon solu kuuluu. Voit tehdä tämän jakamalla solun sijainnin kolmella:
     box_row = pos[0] // 3
    box_col = pos[1] // 3
  6. Tarkista kunkin 3x3-ruudukon rivin ja sarakkeen kohdalla, onko numero jo olemassa. Jos on, palauta false:
    varten rivi sisään alue (laatikko_rivi*3, box_row*3 + 3):
    varten kol sisään alue (box_col*3, box_col*3 + 3):
    jos board[rivi][sara] == num ja (rivi, sarake) != pos:
    palataVäärä
  7. Jos komentosarja saavuttaa funktion loppuun, mikään Sudoku-säännöistä ei epäonnistunut. Palauta tosi:
    palataTotta
  8. Is_valid()-funktio tarkistaa vain, onko numerosijoittelu kelvollinen, mutta se ei tarkoita, että se olisi oikea vastaus kokonaisratkaisuun. Kutsu solve()-funktion sisällä uudelleen solve()-funktio päivitetyllä taululla. Solve()-funktio saattaa saavuttaa tilan, jossa se ei voi enää käyttää numeroita välilyöntien täyttämiseen. Tässä tapauksessa koko funktio palauttaa epätosi, palauttaa kyseisen solun arvoon 0 ja peruuttaa. Solve()-funktio palauttaa tosi vain, kun komentosarja voi täyttää kaikki tilat:
    varten nro sisään range(1, 10):
    jos is_valid (taulu, numero, (rivi, sarake)):
    board[rivi][sara] = num

    jos ratkaista (lauta):
    palataTotta

    board[rivi][sara] = 0

    palataVäärä

  9. Aloita pulmapelin ratkaiseminen kutsumalla solve()-funktiota alkuperäisellä taululla, skriptin alareunassa, kun olet ilmoittanut solve()-funktion:
    ratkaista (lauta)
  10. Tulosta lopputulos:
    Tulosta("Ratkaistu:")
    print_board (taulu)
  11. Käytä komentorivillä python-komentoa komentosarjan suorittamiseen uudelleen. Katso näytölle tulostettu ratkaistu pulma:
    python sudoku.py

Pelien luominen Pythonilla

Sudoku on vain yksi monista peleistä, joita voit luoda ja ratkaista Pythonilla. Pythonilla voit luoda useita muita pelejä, kuten sanasekoitusta, tekstipohjaista seikkailupeliä tai väripeliä, vain muutamia mainitakseni.