Пажљиво проучите овај код и откријте паметан начин да користите рекурзију за решавање тих лукавих судоку загонетки.

Судоку је популарна слагалица са бројевима која се састоји од мреже 9к9 са цифрама од 1 до 9. Слагалица укључује комбинацију бројева и неких празних места, које треба да попуните.

Када попуњавате празна места, сваки ред, колона и подмрежа 3к3 треба да садрже све цифре од 1 до 9.

Једноставна Питхон скрипта може вам помоћи да решите Судоку загонетку. Може анализирати сва празна места на Судоку табли и пронаћи могући број за попуњавање сваког празног места.

Како направити и приказати Судоку плочу

Унутар Питхон скрипте, мораћете да користите листу низова за чување вредности нерешене Судоку слагалице.

Код коришћен у овом пројекту доступан је у овом ГитХуб репо под лиценцом МИТ-а.

  1. Унутар нове Питхон скрипте која се зове судоку.пи, ускладиштите све вредности за мрежу 9к9. Сваки ред и колона представљају девет бројева дуж и доле Судоку слагалице. Додајте 0 да бисте представили просторе које је потребно решити:
    instagram viewer
    табла = [
    [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. Унутар нове функције под називом принт_боард, користите фор петљу за обраду сваког реда у мрежи:
    дефпринт_боард(одбор, табла):
    за ред ин домет(9):
  3. Да бисте сваки ред раздвојили на трећине, проверите да ли је ред дељив са три и додајте ред:
    ако ред % 3 == 0и ред != 0:
    штампа ("- - - - - - - - - - - - - - ")
  4. Унутар сваког реда, прођите кроз сваку колону. Такође можете поделити колоне на трећине тако што ћете проверити да ли је колона дељива са три:
    за цол ин домет(9):
    ако Цол % 3 == 0и цол != 0:
    штампа (" | ", енд="")
  5. Одштампајте вредност броја сачувану у мрежи. Ако је колона последња колона за тај одређени ред, додајте линију прекида, тако да се следећи ред појави у новом реду:
    ако цол == 8:
    штампа (табла[ред][кол])
    друго:
    принт (стр (плоча[ред][кол]) + " ", енд="")
  6. Позовите функцију за штампање плоче:
    принт_боард (плоча)
  7. У командној линији идите до фасцикле у којој сте сачували своју Питхон скрипту, на пример:
    цд Десктоп
  8. Користите команду питхон да покренете своју Судоку скрипту. Погледајте слагалицу одштампану на екрану:
    питхон судоку.пи

Како идентификовати празне просторе за решавање

Можете да прелазите кроз листе да бисте пронашли размаке који се састоје од 0. Они одређују које просторе је потребно решити.

  1. У новој функцији под називом финд_емпти(), прођите кроз сваки ред и колону на табли:
    деффинд_емпти(одбор, табла):
    за ред ин домет(9):
    за цол ин домет(9):
  2. Ако је вредност тренутне ћелије 0, вратите тренутну позицију празне ћелије:
    ако табла[ред][кол] == 0:
    повратак (ред, колона)
  3. Ако скрипта дође до краја функције, то значи да скрипта није могла да пронађе ћелије са вредношћу 0. У овом случају не враћајте ништа:
    повратакНиједан
  4. У новој функцији која се зове солве(), користите функцију финд да бисте пронашли први празан простор на табли:
    дефрешити(одбор, табла):
    финд = финд_емпти (плоча)
  5. Функција финд_емпти() враћа позицију ћелије у формату тупле, на пример, (0, 2). Сачувајте ове вредности одвојено у ред и цол Променљиве. У супротном, вратите труе да бисте означили да нема празних места за решавање:
    аконе наћи:
    повратакИстина
    друго:
    ред, колона = нађи

Како решити загонетку за сваки ред, колону и мрежу 3к3

Сада када можете да идентификујете први празан простор за решавање, мораћете да покушате да пронађете одговарајући број да попуните тај простор и решите загонетку.

Коришћење рекурзије, позовите солве() функцију у себи да испробате сваку могућу комбинацију вредности и за све остале просторе.

  1. Унутар функције солве(), након што пронађете први празан простор, прођите кроз сваки број од 1 до 9. Ови бројеви представљају могуће бројеве који би могли да попуне нерешени простор:
    за бр ин домет(1, 10):
  2. Унесите таблу, могући број и позицију празне ћелије у нову функцију. Нова функција ће вратити тачно ако је тај број важећи број који може да реши тај празан простор. Ако је валидан, доделите тај број ћелији на табли:
    ако ис_валид (табла, број, (ред, колона)):
    табла[ред][кол] = бр
  3. Креирајте функцију ис_валид() са одговарајућим параметрима:
    дефје важећа(табла, број, поз):
  4. Користите ову функцију да проверите да ли постављање броја на ту позицију крши нека правила игре Судоку. Прво проверите да ли тај број већ постоји у реду или колони ћелије:
    за цол ин домет(9):
    ако табла [пос[0]][цол] == бр и пос[1] != цол:
    повратакФалсе

    за ред ин домет(9):
    ако табла[ред][пос[1]] == бр и пос[0] != ред:
    повратакФалсе

  5. Узмите мрежу 3к3 којој ћелија припада. То можете учинити тако што ћете позицију ћелије поделити са три:
     бок_ров = пос[0] // 3
    бок_цол = пос[1] // 3
  6. За сваки ред и колону у тој мрежи 3к3 проверите да ли број већ постоји. Ако јесте, вратите фалсе:
    за ред ин опсег (ред_кутије*3, бок_ров*3 + 3):
    за цол ин опсег (бок_цол*3, бок_цол*3 + 3):
    ако табла[ред][кол] == бр и (ред, колона) != поз:
    повратакФалсе
  7. Ако скрипта дође до краја функције, то значи да ниједно од Судоку правила није успело. Врати тачно:
    повратакИстина
  8. Функција ис_валид() само проверава да ли је постављање бројева исправно, али то не значи да је то тачан одговор на целокупно решење. Унутар функције солве() позовите поново функцију солве() са ажурираном плочом. Функција солве() може достићи стање у којем више не може да користи бројеве за попуњавање празнина. У овом случају, цела функција враћа нетачно, ресетује ту одређену ћелију назад на 0 и враћа се назад. Функција солве() враћа тачно само када скрипта може да попуни све просторе:
    за бр ин домет(1, 10):
    ако ис_валид (табла, број, (ред, колона)):
    табла[ред][кол] = бр

    ако реши (табла):
    повратакИстина

    табла[ред][кол] = 0

    повратакФалсе

  9. Да бисте почели да решавате загонетку, позовите функцију солве() са оригиналном плочом, на дну скрипте, након што декларишете функцију солве():
    решити (табла)
  10. Одштампајте коначни резултат:
    штампа ("Решено:")
    принт_боард (плоча)
  11. У командној линији користите команду питхон да поново покренете скрипту. Погледајте решену слагалицу штампану на екрану:
    питхон судоку.пи

Прављење игара помоћу Питхон-а

Судоку је само једна од многих игара које можете креирати и решити користећи Питхон. Можете да користите Питхон за креирање разних других игара, као што је мешање речи, текстуална авантуристичка игра или игра у боји, да споменемо само неке.