Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
UNIVERZITA PALACKÉHO V OLOMOUCI PŘÍRODOVĚDECKÁ FAKULTA KATEDRA MATEMATICKÉ ANALÝZY A APLIKACÍ MATEMATIKY
DIPLOMOVÁ PRÁCE
Matematika Sudoku
Vedoucí diplomové práce: Vypracovala:
RNDr. Tomáš Fürst, Ph.D. Bc. Lucie Pešková
Rok odevzdání: 2011 AME, II. ročník
- 2 -
Prohlášení
Prohlašuji, že jsem diplomovou práci zpracovala samostatně pod vedením pana
Tomáše Fürsta a všechny použité zdroje jsem uvedla.
V Olomouci dne 30. března 2011
- 3 -
Poděkování
Ráda bych na tomto místě poděkovala svému vedoucímu diplomové práce panu
Tomáši Fürstovi za odbornou pomoc, připomínky a hlavně čas, který mi při konzultacích
věnoval. Dále bych chtěla poděkovat mé rodině, která mě při studiu vždy podporovala.
- 4 -
Obsah: Úvod 6
1 Sudoku 7
1.1 Úvod k Sudoku 7
1.2 Historie Sudoku 7
1.3 Magické čtverce 8
1.4 Latinské čtverce 9
1.5 Princip Sudoku 12
1.6 Terminologie 13
1.7 Popularita Sudoku 16
1.8 Varianty Sudoku 18
1.8.1 Sudoku s nápovědou (neboli Number Place Sudoku) 18
1.8.2 Klasické Sudoku (neboli Classic Sudoku) 19
1.8.3 X Sudoku (neboli Diagonal Sudoku) 19
1.8.4 Sudá/Lichá Sudoku (neboli Odd/Even Sudoku) 19
1.8.5 Sudoku s netypickými oblastmi (neboli Extra-Regions Sudoku) 20
1.8.6 Menší/Větší Sudoku (neboli Sudoku < >) 20
1.8.7 Šipkové Sudoku (neboli Arrow Sudoku) 20
1.8.8 Početní Sudoku (neboli Calcudoku) 21
1.8.9 Kruhové Sudoku (neboli Circle Sudoku) 21
1.8.10 Samurajské Sudoku (neboli Samurai Sudoku) 21
1.9 Matematika Sudoku 22
1.9.1 Všechny možnosti Sudoku 22
1.9.2 Počet vyplněných polí v Sudoku 25
1.10 Metody pro řešení Sudoku 26
1.10.1 Metody určující přímo čísla 27
1.10.1.1 Jediné ve skupině 27
1.10.1.2 Jediná možnost 28
1.10.2 Metody omezující počet kandidátů 29
1.10.2.1 Průsečíky skupin 29
1.10.2.2 Holé množiny 31
1.10.2.3 Zobecněné dvojice 33
- 5 -
1.10.2.4 XY – křížení 38
1.10.2.5 Vedoucí prvek 39
1.10.2.6 Prázdný čtverec 41
2 MATLAB 43
2.1 Magické čtverce v MATLABu 43
2.2 Latinské čtverce v MATLABu 48
2.2.1 Vytvoření latinského čtverce pomocí magického čtverce 48
2.2.2 Vytvoření latinského čtverce pomocí rekurzivního algoritmu 49
2.3 Algoritmy řešící Sudoku 53
2.4 Algoritmy vytvářející zadání Sudoku 57
Závěr 62
Zdroje 63
- 6 -
Úvod
Cílem mé diplomové práce je seznámit čtenáře s dnes velmi populární hrou
Sudoku. A to hned ze dvou pohledů.
První pohled a také první kapitola se bude zabývat hrou samotnou, kdy se kouknu
na její historii, s tím souvisejí magické a latinské čtverce. Dále vysvětlím princip této hry a
ukážu nějaké méně známé varianty Sudoku. Velkou část této kapitoly budu věnovat
souvislosti matematiky a Sudoku a to ze dvou pohledů. První pohled se bude zabývat tím,
kolik je všech možností Sudoku a druhý pohled, kolik musí být předvylněno číslic
v zadání, aby bylo Sudoku řešitelné. A v závěru této kapitoly se pokusím vysvětlit různé
metody pro řešení, které ukážu názorně na příkladech, aby bylo čtenáři jasné, jak Sudoku
luštit a sám zvládl vyluštit jakékoliv zadání.
Druhý pohled a zároveň druhá kapitola se podívá na Sudoku z hlediska
programátorského. Také krátce seznámím čtenáře s matematickým programem MATLAB,
ve kterém budu všechno vytvářet. Prvně se opět podívám na magické a latinské čtverce a
jak je lze vytvořit v MATLABu. Dále se pokusím vytvořit algoritmus, který bude jakékoliv
Sudoku řešit a v případě, že bude více správných řešení, tak aby to poznal a vypsal je. Pak
se také pokusím vytvořit algoritmus, který bude Sudoku zadávat, aby si čtenář mohl
kdykoliv nějaké zadání vygenerovat a poté si jej vyřešit a zkontrolovat.
- 7 -
1 Sudoku
1.1 Úvod k Sudoku
Sudoku je bezesporu jedna z nejoblíbenějších logických her, kterou hrají denně
statisíce lidí po celém světě. Jde totiž o jedinečný hlavolam, který vyplňují lidé všech
věkových kategorií bez ohledu na vzdělání a společenské postavení. Krása Sudoku tkví
v jeho „jednoduchosti“ a téměř nevyčerpatelném množství herních kombinací. Sudoku
zcela potvrzuje starou a dobře známou poučku o tom, že v jednoduchosti je krása.
K luštění totiž zcela postačí papír a tužka.
Rébus Sudoku dnes najdeme dokonce i v některých světových denících. Píší se
o něm knihy a spousta lidí si nedovede představit, že by tuto hru nenašla ve svém
mobilním telefonu. Novozélanďan Wayne Gould řekl: „Nejsem si jistý, proč je Sudoku tak
návyková. Akorát vím, že to tak je!“ [18].
Číselné rébusy založené na doplňování čísel zná lidstvo už odpradávna. Nejprve to
byly magické čtverce, které vysvětlím později, jejichž původ sahá přinejmenším do roku
2000 před naším letopočtem. V 18. Století to byly populární rébusy švýcarského
matematika a astronoma Leonharda Eulera, o kterých se také zmíním později [9].
1.2 Historie Sudoku
Sudoku je logická hra, která vznikla v Americe. Sudoku v podobě, jak jej známe
dnes, vytvořil v roce 1979 Howard Garns a publikoval jej pod názvem „Number Place“
v časopise Dell Pencil Puzzle & Games [9] jako jednu z mnoha logických úloh určenou
pro zábavu. A právě z tohoto časopisu ji o sedm let později převzali a vydali japonští
vydavatelé magazínu Nikoli, kde Sudoku vycházelo pod názvem „Súdži wa dokušin ni
kagiru“, což velmi volně přeloženo do češtiny znamená „vlož každé číslo na určené
místo“. A právě z tohoto názvu vznikl dnešní název Sudoku. Kromě dnešního názvu
Sudoku se také objevily názvy jako „Su Doku“, nebo „Nanpure“ [10].
- 8 -
Ale až v roce 2005 se Sudoku stalo mezinárodním hitem a zasloužil se o to
Novozélanďan Wayne Gould, který vymyslel speciální počítačový program, který dokázal
vygenerovat obrovské množství mřížek s předvyplněnými některými číslicemi. Tento
program bezplatně poskytnul londýnskému listu The Times, který začal pravidelně tento
rébus vydávat jako přílohu ve svých novinách. Ostatní země nechtěly zůstat pozadu, a
proto dnes Sudoku můžete najít v mnoha novinách a časopisech [18].
1.3 Magické čtverce
V úvodu jsem se zmínila o magických čtvercích, jejichž původ sahá přinejmenším
do roku 2000 před naším letopočtem. Podle čínské legendy zemi tehdy zachvátila potopa.
Přívaly vody neustávaly, ačkoli lidé bez přestání konali oběti. Pak si jedno dítě všimlo,
že se z řeky Lo vynořila želva, na jejímž hřbetě byly tečky odpovídající číslicím 1 až 9.
Byly uspořádány do tří řad a tří sloupců tak, že součtem čísel vodorovně, svisle i šikmo
bylo vždy číslo 15. Tomuto číslu se někdy říká magická konstanta. Lidé pochopili, že musí
vykonat patnáct obětí, jak jim ukázaly číslice. Když tak učinili, vody začaly ustupovat.
První magický čtverec byl podle místa svého původu nazván Lo Šu [9].
Magickým čtvercem se rozumí čtverec, který má n řádků, n sloupců a n2 políček,
do kterých jsou vepsána čísla 1, 2, 3, …, n2 tak, aby součet čísel v každém řádku, sloupci a
na obou úhlopříčkách byl stejný. Což si můžete ověřit na následujícím příkladu:
Magickým číslem se označuje konstantní číslo, které dostaneme součtem
jednotlivých řádků, sloupců a úhlopříček. Toto číslo se dá jednoduše vypočítat podle
následujícího vzorce:
7 12 1 14
2 13 8 11
16 3 10 5
9 6 15 4
- 9 -
2)1( 2
nnM pro n 1.
Nejstarším a nejznámějším dokladem o znalosti magických čtverců ve střední
Evropě je mědirytina německého malíře Albrechta Dürera s názvem Melancholie, která se
datuje do roku 1514. Jak si můžete všimnout tento letopočet lze nalézt v posledním řádku
uprostřed. Další zajímavostí je fakt, že magické číslo 34 nedostaneme pouze po součtu
řádků, sloupců a úhlopříček, ale dokonce i po součtu čísel ve čtvercích 2 x 2 a čísel
v rozích čtverce.
Dá se říci, že Sudoku je méně náročnou variantou těchto magických čtverců [12].
1.4 Latinské čtverce
V roce 1783 vymyslel geniální švýcarský matematik, fyzik a astronom
Leonhard Euler nový typ magických čtverců, tzv. latinské čtverce. Jejich název byl
odvozen od písmen latinské abecedy, které byly použity místo čísel. Tyto čtverce se
[13]
- 10 -
podobali dnešnímu Sudoku tím, že každé písmeno se mohlo objevit pouze jednou
v každém řádku i sloupci. Dále to budu vysvětlovat na číslech.
Latinským čtvercem se rozumí čtverec, který má n řádků a n sloupců, do kterých
jsou vepsána čísla 1, 2, 3, …, n tak, aby v každém řádku a sloupci bylo právě každé číslo
od 1, …, n [15]. Tak jak je vidět na následujícím obrázku.
Dále Leonhard Euler objevil překvapivou souvislost magických a latinských
čtverců. Odvodil, že když se sestrojí čtverec lichého řádu vhodným způsobem, dostaneme
z něj magický a po úpravě i latinský čtverec. Za vhodný způsob uvažujeme tento postup:
vepíšeme číslo 1 doprostřed prvního řádku. Číslo 2 zapíšeme o jeden řádek výše a o jeden
sloupec doprava. Nad prvním řádkem je poslední řádek a vpravo od posledního sloupce je
první sloupec. Může se stát, že máme napsat číslo na již obsazené pole, v tomto případě
napíšeme dané číslo pod číslo předcházející. Takto postupujeme tak dlouho, dokud čtverec
nemáme celý obsazený [14]. Například magický čtverec 5. Řádu vypadá následovně:
Teď z tohoto magického čtverce uděláme latinský čtverec. To znamená, že v našem
případě budeme vpisovat pouze čísla 1, 2, 3, 4 a 5 ve stejném pořadí jako čísla předtím.
Pak latinský čtverec vypadá následovně.
1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
- 11 -
Sestavit magický čtverce se sudým počtem polí je o něco těžší než u čtverce
s lichým počtem polí. Existuje mnoho metod, jak se dají sestrojit. Ukážu to na čtverci
4 x 4. Začneme tak, že vepíšeme číslo 1 do horního levého rohu. Číslo 2 napravo od čísla
1. Pak následuje trojka a čtverka. Tím je horní řada vyplněná. Do druhé řady vyplňuji
analogicky čísla 5 až 8, do třetí řady čísla 9 až 12 a v poslední řadě 13 až 16. Čtverec
vypadá následovně
Nyní musíme, vyjmou prostřední dvě čísla ve vnějších řádcích a sloupcích. To
znamená v horní řadě čísla 2 a 3, ve spodní řadě čísla 14 a 15, v levém sloupci čísla 5 a 9 a
nakonec v levém sloupci čísla 8 a 12.
Tyto dvojice čísel mezi sebou proházíme. Vždycky v dané dvojici nejprve čísla
mezi sebou prohodíme a prohodíme je z dvojicí naproti. Tzn. Dvojici 2 a 3 mezi sebou
prohodíme na dvojici 3 a 2 a dosadíme do spodní řady místo čísel 14 a 15. To samé
naopak. Do horní řady dosadíme 15 a 14. Analogicky bychom to provedli pro sloupce. A
dostali bychom takový magický čtverec.
2 4 1 3 5
3 5 2 4 1
4 1 3 5 2
5 2 4 1 3
1 3 5 2 4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
1 15 14 4
12 6 7 9
8 10 11 5
13 3 2 16
- 12 -
Leonhard Euler se také zabýval otázkou, zda může šachovnicový kůň postupně
projít všechna pole na šachovnici tak, aby na každé pole vstoupil právě jednou. Na typické
šachovnici 8 x 8 polí existuje obrovské množství řešení. Ale Leonhard Euler objevil jedno
speciální řešení, který vypadá následovně.
Tento čtverec popisuje nejen cestu šachového koně, ale dokonce se jedná
o polomagický čtverec, protože součet řádků i sloupců je roven číslu 260, ale neplatí to
pro úhlopříčky [14]. Až do roku 2003 se matematici snažili najít dokonalý magický čtverec
založený na jezdcových tazích, ale bylo dokázané, že takovýto čtverec nemůže existovat.
Pokud by ale bylo možné šachovnici zvětšit na 12 x 12 a větší počet polí, který by byl
navíc dělitelný 4 tzn. 12 x 12, 16 x 16, 20 x 20 atd. je možné dokonalý magický čtverec
najít [18].
1.5 Princip Sudoku
Nyní vysvětlím pravidla klasického Sudoku. Na začátku máme hrací plochu, která
je rozdělena na 9 x 9 čtverečků. Zároveň čtvercový hrací plán je rozdělen na 9 menších
čtverců (3 x 3). Každé pole má tedy 9 čtverečků (3 x 3). V některých čtverečcích jsou
předvyplněna čísla z intervalu <1 – 9> (o jejich zadávání se zmíním později). Úkolem
hráče je doplnit tabulku tak, aby v každém sloupci, řádku i malém čtverci (3 x 3) byla
1 48 31 50 33 16 63 18
30 51 46 3 62 19 14 35
47 2 49 32 15 34 17 64
52 29 4 45 20 61 36 13
5 44 25 56 9 40 21 60
28 53 8 41 24 57 12 37
43 6 55 26 39 10 59 22
54 27 42 7 58 23 38 11
- 13 -
všechna čísla od 1 do 9 (libovolně poskládána, žádné se nesmí opakovat). Na následujícím
obrázku můžete vidět příklad, jak může být Sudoku zadaná.
1.6 Terminologie
Zde vysvětlím některé důležité pojmy, které dále budu používat a které nemusí být
vždy jasné.
Pole
Polem myslím každé z 81 míst čtvercové sítě, kam ve hře Sudoku zapisujeme čísla.
Souřadnice
Jednotlivá pole budu označovat dvojicí čísel v závorkách (řádek, sloupec), počítáno
shora dolů a zleva doprava.
1 9 8 7 2 6
3 2 1
1 4 5 2 1 8 9
3 2 6
9 3 8 7 1
5 8 6 9
- 14 -
Řádek
Odpovídá intuitivně chápanému pojmu řádku.
Sloupec
Odpovídá intuitivně chápanému pojmu sloupec.
Blok
Blokem myslím skupinu 3 x 3 polí v silně orámovaném čtverci. Na hracím poli je
celkem 9 takových bloků a budeme je označovat po řádcích čísly 1-9 – viz obrázek.
Skupina
Skupinou rozumím kterýkoliv z pojmů řádek, sloupec nebo blok.
Kandidát
Pokud je více možností, jaké číslo lze na pole umístit, mluvím o kandidátech. Dále
budu kandidáty zobrazovat tak, jak je na obrázku (malými modrými čísly v horní části
pole).
- 15 -
479 1479 14579 489 19 1489 12457 6 123458
9
469 8 2 7 169 3 145 15 1459
4679 3 1479 2 169 5 147 178 1489
2478 47 478 4568 567 4678 3 9 124568
1 5 6 3489 379 4789 247 278 248
4789 479 34789 1 35679 2 4567 578 4568
469 1469 149 3569 123569 169 8 1235 7
5 1679 1789 369 4 1679 126 123 1236
3 2 17 56 8 167 9 4 156
Vázaná dvojice
Při řešení úloh budu v celé řadě metod používat pojem „vázaná dvojice“. Tím
myslím situace, kdy ve skupině (řádku, sloupci nebo bloku) se vyskytnou právě dvě pole,
obsahující nějaké konkrétní číslo jako kandidáta.
Jejich význam tkví v tom, že vždy musí platit buď jeden, nebo druhý prvek
z dvojice. Ukážu tuto situaci na konkrétním příkladě na následujícím obrázku (vybrala
jsem jen nějaké vázané dvojice, protože jich existuje celá řada).
Např. číslo 8 se v konečném řešení objeví buď na pozici (1,4) nebo na pozici (1,6),
nikde jinde se nemůže ve druhém bloku objevit. To samé platí pro další dvě označené
vázané dvojice. Tzn. číslo 6 se v 7. řádku objeví na pozici (6,7) nebo (8,7). A poslední
označená dvojice čísla 7 označuje, že se číslo 7 objeví v posledním řádku na pozici (9,3)
nebo na pozici (9,6).
- 16 -
1.7 Popularita Sudoku
Velmi populárním se Sudoku stalo na konci roku 2004 ve Velké Británii a postupně
se rozšiřuje do celé Evropy. Rychlost, jakou se Sudoku šíří světem je způsobeno hlavně
internetem, protože dnes existuje okolo 30 miliónů internetových stránek, které se
o Sudoku alespoň zmiňují. Ale podstatnou úlohu sehrála i média, která tento rébus začala
ve velkém tisknout do mnoha novin a časopisů. Sudoku bývá často označováno jako „hra
roku 2005“ či „nejpopulárnější hlavolam současnosti“ [11].
Řešení Sudoku je věcí logického myšlení ne matematickou úlohou, jak se může
na první pohled zdát. A na oblibě ji přidává i fakt, že není závislá na žádném jazyce,
z čehož vyplývá, že nevyžaduje žádnou slovní zásobu ani žádné vědomosti.
- 17 -
Číslice v řádku, sloupci a blocích jsou všude ve světě stejné, proto je možné je
nahradit jakýmikoliv devíti symboly. Sudoku se dá hrát například s písmenky, obrázky
nebo barvami. Rovněž počet polí je měnitelný. Pro děti je možné mít Sudoku jen třeba
o 4 x 4 polích a naopak pro profesionály a velmi dobré hráče třeba Sudoku o rozměrech
16 x 16 polí.
Na obrázkcích jsou nějaké ukázky.
Další výhodou může být fakt, že existuje obrovské množství různých zadání. Pokud
se totiž na Sudoku podíváme z matematického hlediska, tak nám vyjde, že je přesně
6 670 903 752 021 072 936 960 (přibližně 6,67 triliard) možností, ke kterým se vrátím
ještě později. Jinak řečeno. Za předpokladu, že byste začali luštit v den svého narození a
dožili se stovky let, tak byste museli každou sekundu vyluštit přibližně 2 113 881 838 930
Sudoku což je nemožné [5].
O popularitě Sudoku svědčí i to, že se v březnu roku 2006 konalo v italském městě
Lucca první oficiální mistrovství světa v Sudoku, které překvapivě vyhrála Češka Jana
Tylová. Když porazila všech 87 soupeřů z 22 zemí světa. Druhé mistrovství světa se
konalo od 28. 3. do 1. 4. 2007 v Praze a mistrem světa se stal Američan Thomas Snyder
[11].
Vůbec poprvé na světě vypravily České dráhy 10. 11. 2007 na koleje „sudokuvlak“.
Šlo o pendolino na trase Praha-Brno a zpět. V rámci společné akce železnice, Českého
rozhlasu Online a knihkupectví Kanzelsberger tehdy proběhl dětský turnaj v Sudoku [11].
- 18 -
Někteří dokonce hovoří o tom, že tento hlavolam se stal stejně populárním jako
před lety Rubikova kostka, se kterou má Sudoku mnoho společného. Protože kostka se dá
otáčet třemi směry a každá z její strany se skládá z 3 x 3 čtverečků. Sudoku má taky
3 dimenze: řádky, sloupce a bloky. V Sudoku je také 3 x 3 čtverců a každý z nich má 3 x 3
políček.
Jelikož je omezený počet postupů při řešení, dá se očekávat, že této hře časem
odvane popularita.
1.8 Varianty Sudoku [8]
Bylo vymyšleno obrovské množství různých Sudoku. A tady jsou ukázky jen
některých z nich:
1.8.1 Sudoku s nápovědou (neboli Number
Place Sudoku)
Takto vypadalo původní zadání Sudoku,
které vymyslel Howard Garns. Pravidla pro řešení
jsou stejná jako u normální Sudoku, jen je tu malá
nápověda na začátek. Pod tabulkou jsou uvedena
čísla, která jsou potřeba doplnit do kroužků
v zadání. Čísla můžeme doplňovat v libovolném
pořadí, protože do každého kroužku padne pouze 1
číslo z nabídky.
1 9 8 7
2 6
3 2 1
1 4 5
2 1 8 9
3 2 6
9 3 8
7 1
5 8 6 9
1 2 4 9
- 19 -
1.8.2 Klasické Sudoku (neboli Classic Sudoku)
Klasické Sudoku, jak je znáte z většiny
novin a časopisů.
1.8.3 X Sudoku (neboli Diagonal Sudoku)
Liší se od klasického Sudoku tím, že se
čísla 1 – 9 musí objevit i na diagonále.
1.8.4 Sudá/Lichá Sudoku (neboli Odd/Even
Sudoku)
Pravidla jsou podobná jako při klasickém
Sudoku jen s tím rozdílem, že na šedých polích
můžou být jen sudá čísla a na bílých polích jen lichá
čísla.
1 9 8 7
2 6
3 2 1
1 4 5
2 1 8 9
3 2 6
9 3 8
7 1
5 8 6 9
1 6
2 9 4 7
3 2
7 6 5
5 8 7
7 5
5 9 1 8
8 9
3 4 8
7
4 2 6 9
3 7 9
6 9 8 5
3 8
7 4 1
7 8 9 4
8 3 5
- 20 -
1.8.5 Sudoku s netypickými oblastmi (neboli
Extra-Regions Sudoku)
Čísla od 1 do 9 se navíc objeví i na stejně
barevných polích.
1.8.6 Menší/Větší Sudoku (neboli Sudoku
< >)
U tohoto typu Sudoku musí platit
matematická znaménka > (menší než) a < (větší
než) pro doplněná čísla podle konkrétního zadání.
1.8.7 Šipkové Sudoku (neboli Arrow Sudoku)
Další velice zajímavá možnost Sudoku.
Princip spočívá v tom, že číslo, které se objeví
v kolečku, se musí rovnat součtu všech čísel,
kterými prochází daná šipka za dodržení všech
základních pravidel.
- 21 -
1.8.8 Početní Sudoku (neboli Calcudoku)
U tohoto Sudoku doplňujeme jen číslice od 1 do
6 a musí platit, že v každém řádku a sloupci se vyskytne
právě jedna z těchto číslic. A druhou podmínkou je,
že v označeném bloku se musí objevit taková čísla, aby
součet, rozdíl, součin či podíl se rovnal číslu v zadání.
U podílu vždycky dělíme menší číslo od většího.
Např. v pravém horním rohu, kde vidíme
matematickou operaci 6+ pro 2 políčka, se mohou objevit tyto kombinace čísel: 1+5, 2+4.
1.8.9 Kruhové Sudoku (neboli Circle
Sudoku)
Do tohoto Sudoku doplňujeme čísla
od 1 do 12. Musí platit, že v každém ze 6 kruhů
se musí objevit každé číslo jen jednou. A
v barevně odlišných kruhových výsečích se
rovněž musí objevit všechna čísla 1 – 12.
1.8.10 Samurajské Sudoku (neboli
Samurai Sudoku)
Toto Samurajské Sudoku se liší
od klasického Sudoku jen tím, že je zde
spojeno více klasických Sudoku do jedné
větší Sudoku.
- 22 -
1.9 Matematika Sudoku
Sudoku je velmi zajímavá nejen pro luštitele, ale také pro matematiky.
Matematickou analýzu Sudoku můžeme rozdělit do dvou oblastí. První z nich se zaměřuje
na počet všech možných Sudoku a druhá se zaměřuje na počet vyplněných polí.
1.9.1 Všechny možnosti Sudoku
Prvně si musíme uvědomit, že Sudoku je zvláštním případem latinských čtverců,
které byly vysvětleny výše. Výpočet latinských čtverců je sám o sobě složitým úkolem,
protože není znám žádný obecný vzorec. Je známo, že počet latinských čtverců rozměru
9 x 9 je
N1 = 5 524 751 496 156 892 842 531 225 600 2710525,5
V Sudoku jsou další omezující podmínky, takže toto číslo bude o něco menší a to
přesně
N0 = 6 670 903 752 021 072 936 960 2110671,6
všech možností [16].
Nyní naznačím, jak lze k tomuto číslu dojít. Budu uvažovat blok 1 v tomto tvaru:
Tato úvaha mi sníží počet možností o 9! = 362 880. Dostáváme
N1 = ,10838,1!9
N 160 což je počet možností Sudoku, které mají blok 1 v uvažovaném
tvaru.
1 2 3
4 5 6
7 8 9
- 23 -
Teď musím zvážit všechny možné způsoby jak vyplnit blok 2 a blok 3. Začnu
prvním řádkem bloku 2 a 3. Je jasné, že tento řádek budou tvořit čísla z 2. a 3. řádku bloku
1 v libovolných kombinacích. Nyní vypíši všechny možné trojice čísel pro první řádek 2. a
3. bloku, pro které platí, že číslice v trojici jdou vzestupně.
{4, 5, 6}{7, 8, 9} {5, 6, 7}{4, 8, 9}
{4, 5, 7}{6, 8, 9} {5, 6, 8}{4, 7, 9} {4, 5, 8}{6, 7, 9} {5, 6, 9}{4, 7, 8} {4, 5, 9}{6, 7, 8} {5, 7, 8}{4, 6, 9} {4, 6, 7}{5, 8, 9} {5, 7, 9}{4, 6, 8} {4, 6, 8}{5, 7, 9} {5, 8, 9}{4, 6, 7} {4, 6, 9}{5, 7, 8} {6, 7, 8}{4, 5, 9} {4, 7, 8}{5, 6, 9} {6, 7, 9}{4, 5, 8} {4, 7, 9}{5, 6, 8} {6, 8, 9}{4, 5, 7} {4, 8, 9}{5, 6, 7} {7, 8, 9}{4, 5, 6}
Když si teď vezmu nejlehčí možnost, kdy jsou čísla vzestupně, tzn. {4, 5, 6}{7, 8,
9}. Lze lehce ukázat, že trojice čísel {4, 5, 6} i {7, 8, 9} lze napsat v šesti různých
kombinacích.
{4, 5, 6} {4, 6, 5}{5, 4, 6}{5, 6, 4}{6, 4, 5}{6, 5, 4}
{7, 8, 9} {7, 9, 8}{8, 9, 7}{8, 7, 9}{9, 7, 8}{9, 8, 7}
Tzn. 312 93 )(3!2 6 možností kombinací pro doplnění 2. a 3. bloku s trojicí čísel {4, 5,
6} {7, 8, 9}.
Další případy doplnění 2. a 3. bloku, kdy čísla horní řady mohou být v libovolných
kombinacích už jsou složitější, ale stále rychle spočitatelné. Vezmu zase příklad, kdy do 1.
řádku 2. a 3. bloku doplním smíšené trojice {5, 7, 9} a {4, 6, 8}.
- 24 -
Do dalších řádků jsem doplnila 1 z mnoha možností, která se tam může objevit a
písmena X, Y a Z jsou doplněna místo číslic 1, 2 a 3. Protože tyto čísla se můžou libovolně
na písmenech umístit. Máme tedy 3 možnosti pro 3 číslice na 6 pozicích. Když to zapíšu
matematicky, tak dostávám: .)!3(3 6 Stejně můžu postupovat i pro dalších 17 polí v bloku
2 a 3. Celkový počet možností vyplnění bloků 2 a 3 při pevně uvažovaném bloku 1 je:
.2612736)!3(56)!3(318)!3(2 666
Vypsat všechny možnosti vyplnění bloku 2 a 3 by nám trvalo strašně dlouho,
abychom pomocí toho mohli spočítat všechny možnosti Sudoku, budeme se proto snažit
toto číslo co nejvíce snížit. Naštěstí existuje hned několik možností.
První možností je obměňování sloupců v bloku 2 a 3. Podobně jako výše, těchto
možností je .7262 2 Snížením celkového čísla dostáváme .3628872
2612736
Ve skutečnosti jsme nevyčerpali ještě úplně všechny možnosti. Protože první blok
uvažujeme pořád stejný. Ale téměř analogicky bychom to mohli udělat i s blokem 1,
že bychom měnili jeho sloupce. Takto bychom znova snížili číslo pro vyplnění bloku 2 a 3
na 2051 možností [16].
Další možností je obměňovat úplně analogicky řádky. Tím se nám sníží možnosti
pro blok 2 a 3 na 416 [16].
Další snížení docílíme tím, když se zaměříme na zdvojená čísla. Ukážu to
na příkladě.
1 2 3 5 7 9 4 6 8 4 5 6 8 X Y 7 9 Z 7 8 9 4 6 Z 5 X Y
- 25 -
Když se podívám na dvojici čísel {1,4}, {5,8},{6,9} a {3,7}, tak je vidět,
že ve sloupcích, když tyto čísla proměním, tak se nic nestane.
Při použití tohoto omezení se nám počet sníží jen na 71 možností [16]. Hodně
podobně jako pro blok 2 a 3 bychom mohli postupovat pro blok 4 a 7.
Postup, který jsem popisovala až doteď, se dále znatelně komplikuje, proto ho dále
nebudu uvádět. Zmíním, že na celkový počet všech možností byl vymyšlen počítačový
program Bertramem Felgenhaurem a Frazerem Jarvisem v roce 2005, který dokáže spočítat
všechny možné kombinace, a který je z velké části naprogramován pomocí postupu, který
jsem uváděla [17].
Je známo, že celkový počet všech možných kombinací je
9! 12770426797272 72 6 670 903 752 021 072 936 960 2110671,6 .
[16]
1.9.2 Počet vyplněných polí v Sudoku
Nyní se budu zabývat tím, jaký minimální počet polí musí být předvyplněn, aby
Sudoku bylo řešitelné. Ale nejprve vysvětlím, kdy je Sudoku řešitelné a kdy ne.
Dostáváme dvě možnosti řešení:
řešitelné přímou logickou cestou = jediná možnost řešení
neřešitelné
o více správných řešení
zkouším dosazovat náhodně čísla, protože je nelze dosadit podle
žádných logických pravidel, jen dodržuji základní pravidlo Sudoku,
1 2 3 4 5 8 6 7 9 4 5 6 1 7 9 2 3 8
7 8 9 2 3 6 1 4 5
1 2 3 4 5 8 6 7 9 4 5 6 1 7 9 2 3 8
7 8 9 2 3 6 1 4 5
- 26 -
takže se může stát, že do políčka můžu umístit více různých čísel a
dostanu správné řešení
příkladem může být úplně prázdná mřížka, do které doplním
libovolně čísla, aby bylo dodrženo základní pravidlo Sudoku
o špatně předvyplněná čísla
jako příklad může být Sudoku, která bude mít v prvním řádku
předvyplněno dvakrát číslo 1
Je dokázáno, že musí být zadáno minimálně 17 čísel, aby bylo Sudoku řešitelné
s jediným správným řešením [10]. Neznamená to však, že Sudoku, které má vyplněné více
čísel, je jednodušší. Obtížnost záleží na tom, jak jsou čísla rozmístěna a na jejích
vzájemných vazbách, které na první pohled nejsou vidět.
Můžeme tedy rozdělovat Sudoku podle obtížnosti do dvou skupin:
lehké – průměrnému hráči zabere jen pár minut
těžké – průměrnému hráči může trvat i několik desítek minut, než dojde
ke správnému řešení
Je dokázáno, že Sudoku je neřešitelné, pokud nemá zadáno ani jedno číslo
v prvních 3 řadách, i kdyby byly všechny zbývající číslice doplněny. Složité jsou právě ty
úlohy, kde existují prázdné velké plochy, například dva čtverce 3 x 3 naproti sobě
na diagonále. Sudoku, které by v zadání mělo úplně prázdné 3 čtverce 3 x 3, tak by se
nedalo vyluštit logickým postupem.
Dobré Sudoku musí jít vždy vyluštit logicky a ne tak, že tipujeme čísla a jakmile se
dostaneme do slepé uličky, tak číslo vygumujeme a zkoušíme znova [18].
1.10 Metody pro řešení Sudoku
Při řešení lehkých Sudoku si ve většině případů vystačíme se základními metodami
řešení, kterými jsou doplnění jediné možné číslice pro určité pole nebo jediné možné
- 27 -
umístění číslice v některém řádku, sloupci či bloku 3 x 3. U těžších úloh již tomu tak není.
Zde je potřeba si pomoci ještě dalšími, složitějšími metodami či technikami řešení.
Metody řešení můžeme rozdělit do dvou oblastí:
metody určující přímo čísla
o jediné ve skupině
o jediná možnost
metody omezující počet kandidátů
o průsečíky skupin
o holé množiny
o zobecněné dvojice
o XY – křížení
o vedoucí prvek
o prázdný čtverec
V následujících kapitolách všechny tyto metody vysvětlím
1.10.1 Metody určující přímo čísla
1.10.1.1 Jediné ve skupině
Tato velmi jednoduchá metoda vychází ze základního pravidla Sudoku, které říká,
že se ve skupině může každé číslo vyskytovat právě jednou. Hledám tedy takové pole,
na které můžu umístit číslo, abych neporušila základní pravidlo.
Tuto metodu objasním na příkladě a to konkrétně pro číslo 1.
- 28 -
Na prvním obrázku je výchozí situace. Napravo od něj jsou žlutě vybarvena pole,
na kterých se jednička vyskytuje anebo pole, na které přichází jednička v úvahu. Vidíme,
že v bloku 2, 6 a 7 je vždy pouze jedno pole, kam můžeme jedničku umístit. Když na tyto
pole jedničku umístíme (jak je vidět na obrázku 3), zůstane nám v bloku 9 pouze jedno
pole místo čtyř původních, kam můžeme jedničku vložit. Na posledním obrázku jsou
doplněny všechny jedničky na správných pozicích. Toto je podstata této metody.
1.10.1.2 Jediná možnost
Druhou jednoduchou metodou, která vychází ze základního pravidla Sudoku, a
která umožňuje určit číslo, které má být do pole zapsáno, je metoda „jediná možnost“. Tato
metoda, spočívá v tom, že hledám pole, na které můžu umístit jen jediné číslo, aniž bych
měla v řádku, sloupci či bloku duplikátní číslo. Pro lepší pochopení uvedu názorný příklad.
- 29 -
Na obrázku jsou dvě pole vybarvena žlutě. Pokud projdu všechny možnosti, jaké
číslo lze na tyto pole zapsat, zůstane mi pouze jediná možnost pro obě pole a to číslo čtyři.
Na tomto principu funguje celá metoda „jediné možnosti“.
1.10.2 Metody omezující počet kandidátů
1.10.2.1 Průsečíky skupin
Přesněji bych měla psát průsečíky bloku s řádkem nebo sloupcem. Představte si
následující situaci. Budu uvažovat průsečík řádku s blokem. Pole řádku jsou na obrázku
označena zeleně, pole bloku modře a jejich průsečík žlutě. Předpokládám, že se
v průsečíku na žlutě označených polích vyskytují buď dvě, nebo tři stejné číslice jako
kandidáti. Pak mohou nastat dvě situace.
První varianta nastává v případě, pokud se číslo z průsečíku nevyskytuje již nikde
jinde v řádku (na zelených polích), ale vyskytuje se na některých modrých polích v bloku.
Z toho plyne, že nutně musí být číslice umístěna na některém ze žlutých polí (aby byla
- 30 -
dodržena podmínka, že se číslice musí na řádku vyskytnout právě jednou) a jednak fakt, že
se tedy nemůže vyskytnout na žádném z modrých polí (aby byla dodržena podmínka, že se
číslice v bloku musí objevit právě jednou) a proto ji můžeme bez obav vyškrtnout ze všech
modrých polí, kde se vyskytuje jako kandidát. Na konkrétním příkladě to bude vypadat
následovně.
2346 1 456 9 56 4 345 8 7 3489 3457 45789 2 1578 47 345 345 6 4689 4567 45678
9
4567 5678 3 2 1 459
3689 367 1 67 4 5 378 237 238
346 34567 2 1 67 8 9 3457 345
489 457 45789 3 2 79 6 457 1458
1246 9 3 8 57 247 1457 24567 1245
7 246 46 45 359 1 3458 23456 23458
5 8 4 47 379 6 1347 9 1234
V průsečíku bloku 4 a řádku 4 je jedna devítka. Vzhledem k tomu, že je to jediná
devítka v řádku, je jasné, že nemůže být na jiné pozici, proto ji můžu z bloku 4 vyškrtnout
ze všech kandidátů, to znamená na pozici (6,1) a (6,3).
Druhá varianta nastává v případě, že se kromě průsečíku vyskytuje číslo ještě
na některém z polí v řádku a nevyskytuje se ve zbylé části bloku (tzn. na modrých polích).
Pokud má být opět dodržena podmínka, že se v bloku má vyskytnout právě jedna číslice,
znamená to, že musí být na některém ze žlutých polí a nemůže tedy být na žádném
ze zelených polí. Bez obav ji můžeme na všech zelených polích v řádku vymazat
ze seznamu kandidátů. Opět ukázka na konkrétním příkladě.
- 31 -
2346 1 456 9 56 4 345 8 7 3489 3457 45789 2 1578 47 345 345 6 4689 4567 45678
9
4567 5678 3 2 1 459
3689 367 1 67 4 5 378 237 238
346 34567 2 1 67 8 9 3457 345
489 457 45789 3 2 79 6 457 1458
1246 9 3 8 57 247 1457 24567 1245
7 246 46 45 359 1 3458 23456 23458
5 8 4 47 379 6 1347 9 1234
Je vidět, že v průsečíku bloku 8 a řádku 7 je jedna dvojka. Vzhledem k tomu, že je
to jediná dvojka v bloku, je jasné, že nemůže být na jiné pozici, proto můžu
ze zbytku řádku eliminovat zbylé kandidáty na číslo 2 označené malými modrými čísly.
1.10.2.2 Holé množiny
Tato metoda je velmi jednoduchá a většinou není problém příslušná pole s holou
množinou nalézt. Podstatou metody je situace, kdy se v jedné skupině vyskytuje N polí,
která obsahují právě N kandidátů. Vyjdu z nejjednodušší varianty – dvě pole a dva
kandidáti. Představte si situaci, kdy máme na dvou polích ve skupině právě dva kandidáty,
například A a B. Je jasné, že tato dvě pole se v konečném výsledku podělí o tato dvě čísla,
a tím pádem lze tato dvě čísla vymazat ze všech kandidátů v ostatních polích skupiny.
„Obrazně“ znázorním tuto situaci pro dvě čísla v řádku.
- 32 -
Na žlutých polích jsou pouze dva kandidáti A a B a na zbývajících polích v řádku
mohou být libovolní kandidáti (včetně A i B). Z toho vyplývá, že v konečném řešení
nastane právě jedna z těchto dvou možností, žádná jiná:
nebo
To znamená, že na všech zbývajících polích v řádku můžeme případné kandidáty
A a B vymazat.
Stejné pravidlo platí i pro sloupce a bloky. Uvedená situace platí pro 2 čísla
na dvou polích. Ale úplně stejně by to platilo pro 3 čísla na třech polích, 4 čísla na 4 polích
atd. Holé množiny se při řešení vyskytují velmi často, občas i ve velkém množství.
Na dalším obrázku jsem zvýraznila holou množinu čísel 3, 4 a 5 v bloku 3.
2346 1 456 9 56 4 345 8 7 3489 3457 45789 2 1578 47 345 345 6 4689 4567 45678
9
4567 5678 3 2 1 459
3689 367 1 67 4 5 378 237 238
346 34567 2 1 67 8 9 3457 345
489 457 45789 3 2 79 6 457 1458
1246 9 3 8 57 247 1457 24567 1245
7 246 46 45 359 1 3458 23456 23458
5 8 4 47 379 6 1347 9 1234
Po aplikaci metody bych na zbývajícím poli v bloku 3 mohla vymazat kandidáta 4 a
5 a zbylo by tu jen jediné číslo 9, které bych hned mohla dosadit.
- 33 -
1.10.2.3 Zobecněné dvojice
Realizace a princip této metody je jednodušší a názornější než většina výše
uvedených metod, vyhledávající příliš konkrétní kombinace. Začneme definicí.
Definice: Předpokládejme, že máme dvě vázané dvojice (d1 a d2) čísla n, které mají svůj
konec ve stejné skupině (řádek, sloupec, blok). Označme A množinu všech polí, na které
vidí začátek dvojice d1 a B množinu všech polí, na které vidí začátek dvojice d2. Jestliže
v průniku A a B se vyskytuje pole, obsahující jako kandidáta číslici n, můžeme ji z tohoto
pole vymazat.
Nyní ukážu, jak to vypadá názorně. Připomínám však, že vázaná dvojice je dvojicí
čísel, které se vyskytují jako kandidáti ve skupině (řádku, sloupci nebo bloku). Na obrázku
jsou znázorněny dvě vázané dvojice nějakého čísla (označeného hvězdičkou). Vazba je
znázorněna modrou čárou. Konec z každé dvojice musí končit podle definice ve stejné
skupině, v našem případě je to blok 7, vybarvený zelenou barvou.
Na následujícím obrázku jsou barevně zobrazena pole, na která „vidí“ začátky
dvojic. U první dvojice je množina polí A znázorněna modrou barvou, u druhé dvojice je
množina B znázorněna žlutou barvou a oranžově je znázorněn průnik těchto dvou množin.
Pokud se na oranžově zvýrazněném poli vyskytuje jako kandidát číslice, ze které jsou
složeny vázané dvojice, pak můžeme tuto číslici ze seznamu kandidátů na oranžovém poli
vymazat.
Začátek první dvojice d1
Konec první dvojice d1
Začátek druhé dvojice d2
Konec druhé dvojice d2
- 34 -
Nyní podrobněji vysvětlím, jak tato metoda funguje. Platí, že ve vázané dvojici
jedna z číslic musí platit. Z toho vyplývá, že pro každou dvojici mám 2 možnosti. Nejprve
budeme uvažovat dvojici d2. Předpokládám, že platí číslice na poli (2, 2). Pak je jasné, že
nemůže platit číslice na oranžovém poli. Ve druhém případě uvažuji, že platí číslice na poli
(7, 2), z toho plyne, že nemůže platit číslice na poli (9, 3) a musí platit číslice na poli (9, 7).
A z toho opět vyplývá, že nemůže platit číslice na oranžovém poli. Pro dvojici d1 by byl
postup analogický.
Zajímavé je i to, že na polích označených křížkem se klidně mohou vyskytovat jako
kandidáti stejné číslice, jako ve dvojicích aniž bychom narušili princip této metody.
Tím jsme ale ještě nevyčerpali všechny možnosti této metody. Platí totiž další
pravidlo, které říká:
Pravidlo 1: Jestliže máme N vázaných dvojic takových, že tyto dvojice mají v sekvenci
vždy jeden konec umístěn ve společné skupině, pak pro koncové body takové sekvence
platí stejný důsledek jako pro výše zmíněné dvě dvojice.
Ukážu opět názorné zobrazení (viz. Následující obrázek) pro tři vázané dvojice d1,
d2 a d3. Konec první dvojice na pozici (9, 9) sdílí společný řádek 9 se začátkem druhé
dvojice na pozici (9, 6) a konec této druhé dvojice na pozici (8, 4) sdílí společný řádek 8 se
začátkem třetí dvojice na pozici (8, 1). Začátek první dvojice na pozici (2, 9) „vidí“ na pole
znázorněna modrou barvou, konec třetí dvojice na pozici (3, 1) „vidí“ na pole znázorněna
žlutou barvou a oba konce společně „vidí“ na pole znázorněna oranžovou barvou.
Opět jednoduše odvodíme platnost výše zmíněného tvrzení. Platí-li číslo na pozici
(2, 9) nemohou platit kandidáti stejného čísla na oranžových polích. Pokud ale číslo na této
pozici neplatí, musí tudíž platit číslo na (9, 9), z toho plyne, že nemůže platit toto samé
číslo na pozici (9, 6), ale musí z druhé dvojice platit číslo na pozici (8, 4), a to samé
- 35 -
pro třetí dvojici. Nemůže platit číslo na pozici (8, 1), ale platí na pozici (3, 1). Z toho je
opět zřejmé, že se nemůžou na oranžových polích vyskytnout kandidáti daného čísla.
V těchto úvahách můžeme pokračovat ještě dále. Když se na předchozí obrázek
podíváme podrobněji, vidíme, že naše tři dvojice můžeme rozdělit na dvě dvojice. První
dvojici tvoří dvojice d1 a d2 a druhou dvojice d2 a d3.
Nyní můžeme použít výše zmíněné pravidlo 1 pro dvě vázané dvojice. Dostáváme,
že konce první dvojice společně „vidí“ na pole (2,4). A obdobně pro druhou dvojici, která
„vidí“ na pole (3,6), na obrázku jsou tyto pole znázorněna světle oranžovou barvou. To
však znamená, že na těchto dvou polích můžeme rovněž vymazat případné kandidáty a
vyslovit další pravidlo.
Pravidlo 2: Jestliže máme N vázaných dvojic takových, že tyto dvojice mají v sekvenci
vždy jeden konec umístěn ve společné skupině, pak pro koncové body takové sekvence
platí stejný, výše zmíněný důsledek pro každou souvislou podsekvenci složenou z nejméně
dvou vázaných dvojic.
Začátek první dvojice d1
Konec první dvojice d1
Začátek druhé dvojice d2
Začátek třetí dvojice d3
Konec druhé dvojice d2
Konec třetí dvojice d3
- 36 -
To znamená, že pokud budeme mít v sekvenci například pět dvojic, označím je d1
– d5, nehledáme kandidáty na vyškrtnutí pouze pro koncové body celé sekvence, ale
pro všechny koncové body následujících sekvencí:
d1 – d2,
d2 – d3,
d3 – d4,
d4 – d5,
d1 – d2 – d3,
d2 – d3 – d4,
d3 – d4 – d5,
d1 – d2 – d3 – d4,
d2 – d3 – d4 – d5,
d1 – d2 – d3 – d4 – d5.
A abych vyčerpala všechny možnosti až do dna, můžu poslední pravidlo ještě trochu
vylepšit.
Pravidlo 2: Tvoří-li sekvence dvojic uzavřený cyklus (první a poslední dvojice mají jeden
svůj konec ve společné skupině), pak platí výše zmíněné důsledky pro každou podsekvenci
cyklu, složenou z nejméně dvou dvojic.
Pro výše uvedený výčet by to znamenalo, že bych mohla přidat ještě podsekvence,
které procházejí přes spojnici d1 – d5 (čili například d4 – d5 – d1 nebo d5 – d1 – d2).
Nyní ukážu konkrétní příklad. Zpočátku je možné řešit každou Sudoku
jednoduššími metodami, které jsem popsala na začátku, aby se nám Sudoku zjednodušilo.
Teď ale chci ukázat, jak se dá použít pouze poslední zmíněná metoda na příkladě, proto se
jinými metodami nebudu zabývat.
Pokud si zobrazíme kandidáty, dostaneme zobrazení, které je vidět na následujícím
obrázku a na kterém jsem už zvýraznila i některé možnosti pro tuto metodu.
- 37 -
2346 1 456 9 56 4 345 8 7 3489 3457 45789 2 1578 47 345 345 6 4689 4567 45678
9
4567 5678 3 2 1 459
3689 367 1 67 4 5 378 237 238
346 34567 2 1 67 8 9 3457 345
489 457 45789 3 2 79 6 457 1458
1246 9 3 8 57 247 1457 24567 1245
7 246 46 45 359 1 3458 23456 23458
5 8 4 47 379 6 1347 9 1234
Vidíme zde sekvenci třech silně vázaných dvojic kandidáta 3: (4,2) – (2,2), (1,1) –
(1,7) a (8,7) – (8,9). Koncové body (4,2) a (8,9) „vidí“ společně na pole (4,9), které taky
obsahuje kandidáta číslici 3 a tudíž můžeme trojku z tohoto pole vypustit.
Výše jsem zmínila pravidlo, které tvrdilo, že je možné v sekvenci většího počtu
dvojic vyzkoušet i kratší sekvence.
2346 1 456 9 56 4 345 8 7 3489 3457 45789 2 1578 47 345 345 6 4689 4567 45678
9
4567 5678 3 2 1 459
3689 367 1 67 4 5 378 237 238
346 34567 2 1 67 8 9 3457 345
489 457 45789 3 2 79 6 457 1458
1246 9 3 8 57 247 1457 24567 1245
7 246 46 45 359 1 3458 23456 23458
5 8 4 47 379 6 1347 9 1234
- 38 -
Pokud budeme uvažovat jen první dvě dvojice, čili (4,2) – (2,2) a (1,1) – (1,7), pak
jejich koncová pole „vidí“ na pole (4,7), které taky obsahuje kandidáta 3, kterého zde
můžu opět eliminovat.
1.10.2.4 XY – křížení
Tato metoda nám může pomoci v situacích, kdy si myslíme, že již nelze
pokračovat. Často se nám podaří jediným tahem odblokovat zdánlivě těžko řešitelnou
situaci.
Při této metodě musíme vždy vycházet z vedoucího pole, na kterém se vyskytují
dva kandidáti na řešení. Toto pole musí „vidět“ na další dvě pole, které obsahují opět
dvojici kandidátů, přičemž jeden z kandidátů je totožný s jedním z kandidátů na vedoucím
poli a druhý kandidát musí být pro obě pole společný. Vypadá to složitě, ale z obrázku to
bude jasnější.
Žlutě je znázorněno vedoucí pole, které obsahuje dvojici kandidátů X a Y. Růžově
jsou znázorněna pomocná pole, na která vedoucí pole „vidí“. Na těchto polích se musí
vyskytovat vždy jeden z kandidátů z původního pole (v našem případě X nebo Y) a jeden
nový společný kandidát označený C. Tato pomocná pole mají svou množinu polí, na které
„vidí“. Pro pole YC jsem množinu polí označila zelenou barvou a pro pole XC modrou
barvou. Průsečík těchto dvou množin jsem znázornila oranžově. Pokud se na těchto polích
vyskytuje v seznamu kandidátů číslo C, můžeme je ze seznamu vyškrtnout.
A teď objasním, jak to funguje. Na žlutém vedoucím poli bude v konečném řešení
buď X nebo Y, nic jiného se tam objevit nemůže. Pokud budu uvažovat, že zde bude X,
pak na poli s kandidáty XC může být jen C a na oranžově označených polích být tedy C
- 39 -
nemůže. Pokud budu uvažovat druhou možnost, že na vedoucím poli bude Y, pak na poli
s kandidáty YC musí být C a opět na oranžovém poli být C nemůže.
A nyní ukázka na konkrétním zadání Sudoku. Žlutě je zvýrazněno vedoucí pole
(9,4) a růžově znázorněny zbylé prvky XY – křížení. Oranžovou barvou jsou pak
znázorněna pole, z nichž můžeme odebrat kandidáta číslice 5.
2346 1 456 9 56 4 345 8 7 3489 3457 45789 2 1578 47 345 345 6 4689 4567 45678
9
4567 5678 3 2 1 459
3689 367 1 67 4 5 378 237 238
346 34567 2 1 67 8 9 3457 345
489 457 45789 3 2 79 6 457 1458
1246 9 3 8 57 247 1457 24567 1245
7 246 46 45 359 1 3458 23456 23458
5 8 4 47 379 6 1347 9 1234
1.10.2.5 Vedoucí prvek
Tato metoda se hodně podobá předchozí metodě XY – křížení s tím rozdílem, že
nemusíme mít pouze dva kandidáty. Ale zase je větší problém tuto situaci při řešení najít.
V této metodě se vždy jedná o dvojici blok + řádek a blok + sloupec. Ve srovnání
s metodou XY – křížení se může na vedoucím poli (označeno žlutou barvou) vyskytnout
více kandidátů, včetně kandidáta na odstranění. To samozřejmě vyžaduje, aby se na polích,
na která vedoucí prvek v této kombinaci „vidí“, vyskytly všechny kombinace kandidáta
na odstranění se všemi ostatními kandidáty na vedoucím poli. Tím se omezí množina
prvků, ze kterých můžeme kandidáta C vyškrtnout. Protože všechna dotyčná pole musí
na tyto pole „vidět“. Na následujícím obrázku je názorná ukázka. Společnou podmnožinu
všech barevných polí s kandidáty jsem označila oranžovou.
- 40 -
Teď trošku jak to funguje. Pokud bude v konečném řešení na vedoucím poli
některý z kandidátů A – F mimo C, zbylí kandidáti se rozmístí na pole zvýrazněna růžovou
barvou a místo kandidáta, který se umístil na žlutém poli, bude v růžovém poli kandidát C.
Z toho vyplývá, že na oranžovém poli už být kandidát C nemůže a stejně tak v opačném
případě, pokud kandidát C by byl na žlutém vedoucím poli.
Počet kandidátů na vedoucím poli může být 2 a více. Ale každému kandidátovi
musí odpovídat pole znázorněná v našem případě růžovou barvou s dvojicí kandidátů.
Jeden musí být z vedoucího pole a druhý, kterého chceme odstranit, který se objeví
na všech námi uvažovaných polích. Pokud by nastala situace, že by se všechna růžová pole
umístila pouze v řádku, sloupci či bloku, zredukovala by se nám metoda na metodu holé
množiny.Na následujícím obrázku je reálný příklad.
236 1 5 9 6 4 35 8 7 89 345 89 2 18 7 345 345 6
4689 4567 45789 67 68 3 2 1 59
3689 367 1 6 4 5 38 237 238
346 34567 2 1 67 8 9 3457 35
48 457 4578 3 2 9 6 457 158
1 9 3 8 5 2 7 6 4
7 2 6 4 39 1 358 35 358
5 8 4 7 39 6 13 9 123
- 41 -
Vedoucí prvek jsem zvýraznila žlutě, pomocné prvky jsou zvýrazněny růžově.
Při aplikaci metody vedoucího prvku můžeme z pole (9,7) vyškrtnout kandidáta číslice 3.
1.10.2.6 Prázdný čtverec
Tato poslední metoda opět patří ke skupině obtížnějších, protože není na první
pohled vidět. Ale pokud ji použijeme, často se nám podaří odblokovat těžko řešitelnou
pozici.
Na následujícím obrázku, jsem ve druhém sloupci znázornila silně vázanou dvojici
nějakého kandidáta n. V bloku 9, jsou na polích vybarvených růžovou barvou buď
vyřešená čísla, nebo jsou to pole, na kterých není číslo n kandidátem. Naopak na polích
označených C se může číslo n jako kandidát vyskytovat. Ale na alespoň jednom z modrých
polích v bloku 9 se kandidát n vyskytovat musí. Pokud se v takovémto schématu vyskytne
na oranžovém poli kandidát n, můžeme jej vyškrtnout.
Nyní nastíním, na jakém principu tato metoda funguje. Jeden z bodů vázané dvojice
bude v konečném řešení kandidáta n obsahovat. Bude-li to na poli označených písmenem
A, pak určitě nebude kandidát n na poli označených B a ani na poli oranžové barvy.
Ve druhém případě, bude kandidát n na poli B, z čehož vyplývá, že nebude na poli A ani
na žádném z polí zeleného řádku. To znamená, že v bloku 9 bude muset být kandidát n
na některém z modrých polích označených písmenem C. Odtud je opět vidět, že se
kandidát n také nemůže objevit na poli oranžové barvy.
Na následujícím obrázku je ukázka reálného příkladu s použitím této metody.
- 42 -
479 1479 14579 489 19 1489 12457 6 12345
89 469 8 2 7 169 3 145 15 1459
4679 3 1479 2 169 5 147 178 1489
2478 47 478 4568 567 4678 3 9 12456
8
1 5 6 3489 379 4789 247 278 248
4789 479 34789 1 35679 2 4567 578 4568
469 1469 149 3569 12356
9
169 8 1235 7
5 1679 1789 369 4 1679 126 123 1236
3 2 17 56 8 169 9 4 156
V prvním sloupci jsem našla vázanou dvojici kandidáta 9. V bloku 2 odpovídají
zelená pole polím označených písmenem C z předchozího schématu. Po aplikaci metody
prázdného čtverce podle výše zmíněných pravidel, můžeme z pole (7, 5) kandidáta číslo 9
vyškrtnout.
- 43 -
2 MATLAB
MATLAB je programové prostředí pro numerické výpočty, modelování, počítačové
simulace, analýzu a prezentaci dat, vizualizaci dat a mnoho dalších podobných věcí.
MATLAB umožňuje provádět výpočetně náročné úlohy celkem rychle, proto jeden
z důvodů, proč jsem si vybrala právě tento program je rychlost. A druhý důvod je
vysvětlen v následujícím odstavci a souvisí s maticemi, které budu hodně využívat.
Krátce bych se zmínila o tom, jak vznikl název MATLAB. Vznikl zkrácením dvou
slov - MATrix a LABoratory, což volně přeloženo do češtiny znamená „laboratoř
s maticemi“. Proto matice jsou klíčovou datovou strukturou tohoto programu. Jak bude
vidět v následujících kapitolách, matice budu hrát důležitou roli i pro nás.
V dílčích částích této kapitoly se budu věnovat tomu, jak lze naprogramovat
v MATLABu magické čtverce, latinské čtverce, řešení jakéhokoliv zadání Sudoku a pak
také generování různých zadání Sudoku.
2.1 Magické čtverce v MATLABu
V této kapitole se vrátím k již zmíněným magickým čtvercům, které byly
vysvětleny podrobněji v kapitole 1.3. Tady ukážu, jak lze tento čtverec vytvořit
v MATLABu. Není to nic složitého, protože základní magický čtverec má MATLAB už
předdefinovaný příkazem magic(n) a tudíž lze zadat jen číslo n, které určuje, jakého
řádu má výsledný magický čtverec být. Jak tento předdefinovaný algoritmus vypadá a jak
ho chápat, tak tomu věnuji následující část.
Nejprve se podíváme, jak tento algoritmus vypadá. Což můžete vidět hned na
následujících řádcích
- 44 -
fuction M = magic(n) n = floor(real(double(n(1)))); if mod(n,2) == 1 [J,I] = meshgrid(1:n); A = mod(I+J-(n+3)/2,n); B = mod(I+2*J-2,n); M = n*A + B + 1; elseif mod(n,4) == 0 [J,I] = meshgrid(1:n); K = fix(mod(I,4)/2) == fix(mod(J,4)/2); M = reshape(1:n*n,n,n)‘; M(K) = n*n+1 – M(K); else p = n/2; M = magic(p); M = [M M+2*p^2; M+3*p^2 M+p^2]; if n == 2, return, end i = (1:p)‘; k = (n-2)/4; j = [1:k (n-k+2):n]; M([i; i+p],j) = M([i+p; i],j); i = k+1; j = [1 i]; M([i; i+p],j) = M([i+p; i],j); end Jak je vidět, tak algoritmus se rozděluje do čtyř částí, které nyní objasním.
Na prvním řádku je nadefinovaná funkce M = magic(n), pomocí které se celý
algoritmus spouští. Dále je nadefinováno, že se mají doplňovat čísla 1 až dvojnásobek
zadaného čísla n. Tzn. pokud zadáme, že číslo n = 3, pak se do čtverce 3 x 3 doplní čísla
1, 2, 3,…, 9. Analogicky pro libovolné číslo n.
První podmínka
if mod(n,2) == 1 [J,I] = meshgrid(1:n); A = mod(I+J-(n+3)/2,n); B = mod(I+2*J-2,n);
M = n*A + B + 1;
platí pro n liché. V našem případě n = 3. Řádek [J,I] = meshgrid(1:n)
znamená, že se vygeneruje matice J a I v následujícím tvaru
- 45 -
J = 1 2 3 1 2 3 1 2 3
I = 1 1 1 2 2 2 3 3 3 Až máme vygenerované tyto dvě matice, tak můžeme pokračovat v algoritmu, tzn.
vypočítat matici A a B, podle nadefinovaného předpisu
A = mod(I+J-(n+3)/2,n); B = mod(I+2*J-2,n);
Dostaneme matici
A =
2 0 1
0 1 2
1 2 0
a matici
B =
1 0 2
2 1 0
0 2 1
A teď už nám stačí pouze dopočítat matici M, která už bude námi požadovaným
magickým čtvercem, podle následujícího předpisu
M = n*A + B + 1
Výsledná matice M vypadá takto
- 46 -
M =
8 1 6
3 5 7
4 9 2
Úplně na stejném principu je vytvořena druhá a třetí podmínka algoritmu. Rozdíl je
jen v tom, že pokud zadáme sudé číslo, první podmínku pro lichá čísla nám to přeskočí a
číslo n se otestuje, zda je dělitelné 4 nebo není. Pokud je číslo n dělitelné 4, provede se
druhá podmínka. Pokud číslo n je sudé, ale není dělitelné 4, provede se třetí podmínka.
Výsledkem je vždy správný magický čtverec. Z toho nám plyne, že funkce
M = magic(n), dokáže vytvořit magický čtverec jakéhokoliv řádu.
Ukážu magický čtverec desátého řádu
M =
92 99 1 8 15 67 74 51 58 40
98 80 7 14 16 73 55 57 64 41
4 81 88 20 22 54 56 63 70 47
85 87 19 21 3 60 62 69 71 28
86 93 25 2 9 61 68 75 52 34
17 24 76 83 90 42 49 26 33 65
23 5 82 89 91 48 30 32 39 66
79 6 13 95 97 29 31 38 45 72
10 12 94 96 78 35 37 44 46 53
11 18 100 77 84 36 43 50 27 59
V následující tabulce ukážu, jak dlouho MATLABu trvá vytvořit magické čtverce
různých rozměrů. Čas v tabulce je průměrný čas několika pokusů.
Tabulka vypadá následovně
- 47 -
Rozměr Čas (s)
3 x 3 0.000001
5 x 5 0.000005
10 x 10 0.000009
50 x 50 0.0706
100 x 100 0.1312
500 x 500 4.2208
1000 x 1000 16.9372
Jak je vidět, vytvoření magického čtverce rozměru 100 x 100 trvá pouze asi jednu
desetinu sekundy, což je opravdu velmi rychlé. Menší čtverce zaberou ještě méně. Naopak
větší rozměry například čtverec rozměru 1000 x 1000 trvá skoro dvacet sekund.
Závislost času na rozměru magického čtverce ukážu na následujícím grafu
Jak je názorně vidět z grafu, do rozměru magického čtverce 100 x 100 je čas
vygenerování magického čtverce zanedbatelný. Dále s rostoucím rozměrem magického
čtverce roste i výsledný čas generování.
- 48 -
2.2 Latinské čtverce v MATLABu
Tuto kapitolu budu věnovat latinským čtvercům, a jak se dají vytvořit
v MATLABu. Bude to o něco těžší, protože MATLAB nemá předdefinovaný žádný
algoritmus pro tyto čtverce, jak tomu bylo u magických čtverců v předchozí kapitole. Ale
můžeme magické čtverce využít tak, jak jsem psala už dříve v kapitole 1.4 zabývající se
latinskými čtverci. Z toho vyplývá, že latinské čtverce můžu vytvořit dvěma způsoby,
kterým se teď budu věnovat.
2.2.1 Vytvoření latinského čtverce pomocí magického čtverce
První způsob je s využitím magických čtverců a je jednodušší. Nejprve ale musím
vytvořit magický čtverec libovolného řádu a pak do něj místo čísel 1 až n2 dosadit pouze
čísla 1 až n. Ukážu to na konkrétním příkladu. Vytvořím magický čtverec pátého řádu
pomocí příkazu A = magic(5).
A =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
A teď použiji příkaz
B = mod(A,n)+1,
který jsem používala už u magických čtverců. V našem případě, kdy n = 5, dostanu
po provedení tohoto příkazu latinský čtverec, kde čísla 1 až 5 zůstávají na stejných
pozicích a nahrazuju čísla, která jsou větší jak 5. V tomto případě to bude vypadat
následovně číslo 6 = 1, 7 = 2, …, 10 = 5, 11 = 1,…, 25 = 5. Když to provedu, dostanu
latinský čtverec následujícího tvaru
- 49 -
B =
3 5 2 4 1
4 1 3 5 2
5 2 4 1 3
1 3 5 2 4
2 4 1 3 5
Analogicky lze tímto způsobem vytvořit latinský čtverec libovolný řádu.
2.2.2 Vytvoření latinského čtverce pomocí rekurzivního algoritmu
Tento druhý způsob je o něco těžší, ale zase nám pomůže lépe pochopit výsledný
algoritmus pro řešení Sudoku. Což je mým hlavním úkolem této práce. Použiju tedy
rekurzivní algoritmus, který nejprve ukážu, jak vypadá, a pak následně jednotlivé kroky
vysvětlím. Algoritmus vypadá takto
function s = latin(m,s)
global delej
if ~delej return end
n=length(m);
if ~exist('s') s = zeros([size(m),0]); end
krok = min(find(m(:)==0)); if isempty(krok) s(:,:,size(s,3)+1) = m; delej = false; else [i,j] = ind2sub([n,n],krok); for k = randperm(n) if sum(m(i,:)==k)==0 && sum(m(:,j)==k)==0 m(i,j) = k; s = latin(m,s); end end end
- 50 -
Na prvním řádku je opět nadefinovaná funkce pro spouštění. Na druhém řádku
nadefinovaná globální proměnná delej, která se při spouštění musí zadat a slouží k tomu,
aby vypsala první správné řešení, které najde.
Podmínka
if ~delej return
end
říká, že pokud neexistuje proměnná delej, tak se vrať zpátky do algoritmu. Na
následujícím řádku je nadefinováno n, takto
n=length(m);
a znamená to, že číslo n bude stejného rozměru jako zadaná matice m.
Řádek obsahující
krok = min(find(m(:)==0))
znamená, že se hledá první pozice v matici m obsahující nulu. Může se stát, že se v matici
m žádné nuly nevyskytují, proto je tam podmínka
if isempty(krok) s(:,:,size(s,3)+1) = m;
která říká, že pokud se v matici m nevyskytují žádné nuly, tak máme výsledné řešení, které
se má uložit do matice s. Ve druhém případě, kdy se v matici m vyskytují nuly, proběhnou
kroky, které následují na dalších řádcích
else [i,j] = ind2sub([n,n],krok); for k = randperm(n) if sum(m(i,:)==k)==0 && sum(m(:,j)==k)==0 m(i,j) = k; s = latin(m,s); end end
end
a tyto řádky obsahují rekurzivní kroky, které se provádějí následujícím způsobem.
Dosazuji na nulové pozice matice m postupně čísla k, která jsou náhodně vygenerovanou
- 51 -
posloupností zadané posloupnosti čísel. Například pro n = 5, máme posloupnost čísel
1, 2, 3, 4, 5. A když tuto posloupnost čísel náhodně vygenerujeme, můžeme dostat
např. k = 5, 3, 1, 4, 2. Tyto čísla postupně dosazuji na pozici obsahující 0 a
testuji přitom podmínku, že dané číslo se smí objevit v každém řádku i sloupci jednou.
V mém případě najdu první pozici s 0 a zkusím číslo 5, pokud toto číslo nesplňuje danou
podmínku, tak zkouším další číslo v pořadí, dokud není splněna zadaná podmínka. Jak
najdu první číslo, které splňuje podmínku, tak toto číslo uložím do matice m a jdu hledat
znovu další číslo. Pokud nastane situace, že žádné číslo na dané pole není správné, vracím
se o krok výše a změním předchozí doplněné číslo na jiné, které vyhovuje. Tento postup
opakujeme tak dlouho, až v matici m nejsou žádné nuly. Tento algoritmus nám vypíše
první správné řešení, které najde, protože správných řešení může být i více.
Teďka ukážu konkrétní příklad na tento algoritmus, který musím mít v MATLABu
uložený, aby fungoval. Protože pro spuštění tohoto algoritmu je nutné zadat 4 vstupní
argumenty, je lepší si je opět uložit do M-filu, v kterém pak stačí měnit jen číslo n. Tento
M-file se vstupníma hodnotami vypadá následovně
global delej delej = true; m= zeros(5); s = latin(m)
po spuštění tohoto M-filu vidíme hned výsledek. V mém případě, kdy jsem zvolila n = 5,
vypadal výsledek následovně.
s =
1 2 4 3 5
3 1 2 5 4
5 4 1 2 3
4 3 5 1 2
2 5 3 4 1
Tento výsledek je náhodně vybraný ze všech možností pro daný rozměr. To
znamená, že pokud bych M-file spustila znovu, tak je velmi malá pravděpodobnost, že
- 52 -
dostanu úplně stejný latinský čtverec. Kolik je všech možností pro daný rozměr latinského
čtverce ukazuje následující tabulka [15].
Rozměr Počet všech možností
2 x 2 2
3 x 3 12
4 x 4 576
5 x 5 161 280
6 x 6 812 851 200
7 x 7 61 479 419 904 000
8 x 8 108 776 032 459 082 956 800
9 x 9 5 524 751 496 156 892 842 531 225 600
Jak je vidět, tak s rostoucím n hodně rychle roste i počet všech možností.
Teď ukážu ještě jednu tabulku, ve které bude zapsaný průměrný výsledný čas,
vygenerování náhodného latinského čtverce pro různé rozměry, které MATLAB dokáže
Rozměr Čas (s)
2 x 2 0.015
3 x 3 0.023
4 x 4 0.031
5 x 5 0.047
6 x 6 0.078
7 x 7 0.093
8 x 8 0.106
9 x 9 0.109
10 x 10 0.1404
15 x 15 0.6518
20 x 20 1.9188
Jak je vidět, čím větší latinský čtverec, tím je potřeba o kousíček delší čas pro
vygenerování výsledku. Ale vždy je výsledek téměř okamžitě vygenerovaný. Opět ukážu
graf závislosti času na konkrétním rozměru latinského čtverce
- 53 -
Jak je vidět z grafu, tak čas mírně roste pro latinské čtverce do rozměru 10 x 10.
Tento čas je, ale téměř zanedbatelný. S většími rozměry čas prudce stoupá.
2.3 Algoritmy řešící Sudoku
Nyní už se vrhu na to, jak se dá udělat program, který vyřeší jakékoliv zadání
Sudoku. Sudoku lze programově řešit třemi způsoby. První z nich napodobuje lidské
myšlení a doplňuje čísla na základě logických dedukcí. Druhý, rekurzivní, prostě zkouší
všechny možnosti, dokud nedosáhne cíle. A třetí způsob je kombinací zmíněného prvního
a druhého způsobu.
Všechny přístupy mají výhody i nevýhody. „Logický" algoritmus zpravidla
nedokáže vyřešit všechna zadání Sudoku. Umí jen tolik, kolik jej tvůrce „naučil". Oproti
tomu rekurzivní algoritmus vyřeší každé Sudoku a dokonce odhalí i více řešení. Pokud jej
spustíme na prázdné mřížce, najde nám všechny možnosti, jak může Sudoku vypadat, ale
na výsledek bychom čekali asi hodně dlouho, protože těch možností existuje strašně moc,
jak bylo zmíněno v kapitole 1.9.1 a také by nestačila paměť. Třetí způsob je nejlepší.
- 54 -
V této práci se proto budu věnovat pouze třetímu způsobu řešení, protože dokáže
hodně rychle vyřešit jakékoliv zadání Sudoku. Čím je více správných řešení, tím je potřeba
delší čas na řešení.
Jak tento algoritmus vypadá, je vidět v následující části [19]
function s = Sudoku(m,s) if any((size(m)-[9 9])~=0) error('Vložená matice m musí mít 9 řádků a 9 sloupců.') end if any(any(m~=floor(m))) || any(abs(m(:)-4.5)>4.5) error('V matici m můžou být pouze čísla 0 až 9.') end if ~exist('s') s = zeros([size(m),0]); end prvni_krok = min(find(m(:)==0)); if isempty(prvni_krok) s(:,:,size(s,3)+1) = m; else [i,j] = ind2sub([9,9],prvni_krok); for k=1:9 radky = (ceil(i/3)-1)*3+1; sloupce = (ceil(j/3)-1)*3+1; bloky = m(radky:radky+2,sloupce:sloupce+2); if sum(m(i,:)==k)==0 & sum(m(:,j)==k)==0 & sum(bloky(:)==k)==0 m(i,j) = k; s = Sudoku(m,s); end end end
Tento algoritmus se hodně podobá algoritmu, který jsem popisovala u latinských
čtverců v kapitole 2.2.2, proto v této kapitole zmíním jen ty části, ve kterých se od sebe
liší.
V prvním řádku jsem vytvořila opět funkci s = Sudoku(m, s), pomocí které
se bude celý algoritmus spouštět. Kde s je výstupní matice obsahující řešení a m je vstupní
matice obsahující předvyplněná čísla. Do vstupní matice zadáváme předvyplněná čísla
na konkrétní pozice, na kterých se mají ve výsledku objevit, a na pozice prázdných polí
- 55 -
zapisujeme číslo 0. Jak matici m správně zadat do MATLABu a jak spustit celý algoritmus,
ukážu v následující části. Nejprve, jak zadat matici m, která může vypadat například takto
m = [0,1,0,9,0,0,0,8,7;
0,0,0,2,0,0,0,0,6;
0,0,0,0,0,3,2,1,0;
0,0,1,0,4,5,0,0,0;
0,0,2,1,0,8,9,0,0;
0,0,0,3,2,0,6,0,0;
0,9,3,8,0,0,0,0,0;
7,0,0,0,0,1,0,0,0;
5,8,0,0,0,6,0,9,0]
MATLAB nám ji zobrazí jako matici
m =
0 1 0 9 0 0 0 8 7
0 0 0 2 0 0 0 0 6
0 0 0 0 0 3 2 1 0
0 0 1 0 4 5 0 0 0
0 0 2 1 0 8 9 0 0
0 0 0 3 2 0 6 0 0
0 9 3 8 0 0 0 0 0
7 0 0 0 0 1 0 0 0
5 8 0 0 0 6 0 9 0
Nakonec spustím nadefinovaný algoritmus
s = Sudoku(m)
A za chvíli se objeví výsledná matice s
- 56 -
s =
2 1 5 9 6 4 3 8 7
8 3 9 2 1 7 4 5 6
6 4 7 5 8 3 2 1 9
9 7 1 6 4 5 8 2 3
3 6 2 1 7 8 9 4 5
4 5 8 3 2 9 6 7 1
1 9 3 8 5 2 7 6 4
7 2 6 4 9 1 5 3 8
5 8 4 7 3 6 1 9 2
Řešení tohoto hodně lehkého Sudoku trvalo 2,7 sekund. Ale tato doba se mění
v závislosti na obtížnosti zadání Sudoku. Na řešení lehkého Sudoku je potřeba pár sekund,
složité zadání Sudoku může trvat i několik desítek sekund. Pokud existuje více správných
řešení, tak se nám ve výsledku všechny vypíší.
V následující tabulce můžete vidět, jak dlouho v průměru trvalo řešení různých
obtížností zadání Sudoku. Různá zadání jsem čerpala z [21]
Obtížnost lehká Střední Těžká
Čas (s) 0.078 0.321 2.0215
Je vidět, že daný algoritmus dokáže vyřešit jakoukoliv obtížnost zadání Sudoku
v hodně rychlém času.
Teď se ještě vrátím k nadefinovanému algoritmu. Vysvětlím, co jednotlivé řádky
znamenají.
Na třetím až pátém řádku je podmínka,
if any((size(m)-[9 9])~=0) error('Vložená matice m musí mít 9 řádků a 9 sloupců.') end
která kontroluje, zda vložená matice je správného rozměru, tzn. rozměru 9 x 9.
Pokud tomu tak není, tak MATLAB vypíše hlášku, že vložená matice m musí mít 9 řádků a
9 sloupců, což můžete vidět na čtvrtém řádku a je na zadavateli, aby matici zadal správně.
- 57 -
Na dalších třech řádcích je podobná podmínka,
if any(any(m~=floor(m))) || any(abs(m(:)-4.5)>4.5) error('V matici m můžou být pouze čísla 0 až 9.') end
která kontroluje opět vloženou matice, ale tentokrát z pohledu vyplněných čísel.
Zde se kontroluje, zda vložená matice obsahuje pouze čísla 1 až 9. Pokud se v matici
objevují nesprávná čísla, tak MATLAB vypíše hlášku, že v matici m můžou být pouze čísla
0 až 9.
Další části algoritmu jsou téměř stejné jako u latinských čtverců, takže je nebudu
znovu vysvětlovat. Jen zmíním, že tento algoritmus se od latinských čtverců liší ve dvou
věcech. První věcí je to, že v Sudoku musí platit ještě jedna podmínka navíc. A to ta, že se
čísla 1 až 9 musí vyskytovat i v každém bloku 3 x 3. Tato podmínka je do tohoto algoritmu
přidána. A celkově tedy podmínka testuje, zda se dané číslo k vyskytuje v každém řádku,
sloupci i bloku právě jednou.
A druhá odlišnost je v tom, že se zde nemá vybrat náhodně jedno správné řešení,
pokud jich existuje více, ale všechna správná řešení zobrazit. Takže se může stát, že řešení
nebude jednoznačné, a i když to nebudeme čekat, tak se nám ve výsledku může objevit
hned několik správných řešení daného zadání.
2.4 Algoritmy vytvářející zadání Sudoku
V této kapitole se budu věnovat tomu, jak vytvořit správné zadání Sudoku, aby bylo
Sudoku jednoznačně řešitelné, tzn., aby nebylo více správných řešení pro jedno zadání.
Vytváření zadání Sudoku se skládá ze dvou částí: První částí je vyplnění hrací
plochy rozměru 9 x 9 (najít tzv. "budoucí řešení") a druhou částí je vynechání
nepotřebných čísel. Proto i vytvořený algoritmus se bude skládat z těchto dvou částí.
Kompletní mřížku lze opět vytvořit rekurzivně tak, že čísla dosazuji náhodně, aby
bylo dodrženo základní pravidlo Sudoku.
- 58 -
Jak vypadá algoritmus pro první část, tj. vytvoření této mřížky, je vidět
v následující části
function s = zad(m,s) global delej if ~delej return end n=9; if ~exist('s') s = zeros([size(m),0]); end krok = min(find(m(:)==0)); if isempty(krok) s(:,:,size(s,3)+1) = m; delej = false; else [i,j] = ind2sub([n,n],krok); for k=randperm(9) radky = (ceil(i/3)-1)*3+1; sloupce = (ceil(j/3)-1)*3+1; bloky = m(radky:radky+2,sloupce:sloupce+2); if sum(m(i,:)==k)==0 && sum(m(:,j)==k)==0 && sum(bloky(:)==k)==0 m(i,j) = k; s = zad(m,s); end end end
Jak je vidět, algoritmus je téměř totožný s algoritmem pro latinské čtverce
vytvořené rekurzivním způsobem. Akorát zase s tím rozdílem, že je zde pevně daná
velikost čtverce, jako n=9; a opět přidána navíc podmínka, která říká, že se mají čísla 1 až
9 navíc objevit i v bloku 3 x 3.
Pro spuštění tohoto algoritmu potřebuji stejně jako u latinských čtverců zadat
4 vstupní hodnoty. Tyto vstupní hodnoty uložím do M- filu společně s druhou částí
algoritmu pro vygenerování zadání. Nyní ukážu, jak tento algoritmus vypadá
- 59 -
global delej delej = true; m = zeros(9); s = zad(m); delej = true; while delej sold = s; j=ceil(81*rand); s(j)=0; v=Sudoku(s); kolik = size(v,3); if kolik~=1 delej = false; end end sold
První čtyři řádky spouští předchozí algoritmus, úplně stejně jako u latinských
čtverců. Pokud bychom spustili jen tyto čtyři první řádky, tak bychom dostali náhodně
vygenerovanou mřížku označenou jako matici s. Tuto matici nepotřebujeme vidět, protože
by nám prozradila správné řešení, proto ji neukazuji.
Následující podmínka
while delej sold = s; j=ceil(81*rand); s(j)=0; v=Sudoku(s); kolik = size(v,3); if kolik~=1 delej = false; end
end
vynechává náhodně čísla na pozici j v matici s. Do proměnné sold se postupně
ukládá vždycky výchozí matice s, ze které vynechám náhodně číslo. Jakmile je náhodně
vygenerována pozice j, nahradí se tato pozice v matici s nulou a zkouším, pomocí
algoritmu na řešení Sudoku, který byl ukázán v předchozí kapitole 2.3, kolik má Sudoku
správných řešení. Kolik je správných řešení, se zapisuje do proměnné kolik. A testuji,
zda je jen jedno správné řešení nebo je jich více. Pokud je jen jedno správné řešení, tak se
- 60 -
celý algoritmus vynechání čísla opakuje znovu tak dlouho, až je více správných řešení.
Jakmile tato situace nastane. Zobrazí se nám proměnná sold, ve které je uložena matice s
bez posledního vynechaného čísla, která měla jen jedno správné řešení. Tato matice se nám
zobrazí a zastaví celý algoritmus.
Pro spuštění celého algoritmu stačí napsat jen název M-filu, pod jakým máme
uloženou druhou část. A téměř hned se nám vygeneruje náhodně nějaké zadání Sudoku.
Toto zadání může vypadat například takto
sold =
0 9 0 1 6 3 0 0 8
0 0 0 0 0 7 0 0 0
2 0 3 8 0 9 1 0 7
7 0 1 0 3 4 0 0 0
4 6 5 7 0 2 8 3 0
3 0 9 0 0 1 5 0 0
8 0 0 4 0 6 0 0 9
0 3 0 9 0 5 0 8 0
0 0 0 0 0 8 0 4 0
Vygenerování zadání tímto algoritmem trvá v průměru okolo 1.413 sekund a je
velmi malá pravděpodobnost, že vygeneruje dvakrát za sebou stejné zadání. Protože jak
jsem psala v kapitole 1.9.1 je 6,67 triliard možností, z kterých algoritmus vybírá správné
řešení.
Když máme vygenerované zadání, tak není žádný problém si ho zkontrolovat nebo
podívat, jak má vypadat. K tomuto nám stačí využít předchozí algoritmus pro řešení
Sudoku z předchozí kapitoly. Stačí tedy napsat pouze
S = Sudoku(sold)
a hned vidíme řešení.
V našem případě správné řešení vypadá následovně
- 61 -
s =
5 9 7 1 6 3 4 2 8
6 1 8 2 4 7 9 5 3
2 4 3 8 5 9 1 6 7
7 8 1 5 3 4 6 9 2
4 6 5 7 9 2 8 3 1
3 2 9 6 8 1 5 7 4
8 5 2 4 7 6 3 1 9
1 3 4 9 2 5 7 8 6
9 7 6 3 1 8 2 4 5
Teď už nám nebrání nic v tom, abychom luštili každý den od rána do večera pořád
jiné Sudoku.
- 62 -
Závěr
Závěrem bych chtěla říct, že když jsem začala psát tuto práci, tak jsem si myslela,
že hru Sudoku znám celkem dobře. Ale jak se ukázalo, tak tomu tak nebylo ani zdaleka.
Historii této hry jsem téměř neznala, že existují další varianty také ne. Matematikou jsem
se u této hry nikdy nezajímala, protože jsem si myslela, že existuje jen několik možností a
k vyřešení postačí základní kombinatorika. Jak se ukázalo, tak moje myšlenky v tomto
směru byly úplně špatné. Metody na řešení jsem znala jen ty základní, tak pro mě bylo
velkým překvapením, že těchto metod existuje mnohem více, které dokážou ve spoustě
případů řešení zjednodušit i zrychlit.
Mým hlavním cílem této práce bylo naprogramovat v MATLABu algoritmus,
který dokáže vyřešit jakékoliv zadání Sudoku a dále také vytvořit algoritmus, který dokáže
náhodně generovat zadání. Tento cíl se mi podařilo splnit, i když ne vždy, byla cesta
zrovna jednoduchá.
Díky psaní této práce jsem se dozvěděla spoustu zajímavých informací o hře
samotné, prohloubila si své znalosti o programu MATLAB a naučila jsem se v něm i
programovat.
Byla bych ráda, aby tato práce nebyla přínosem jen pro mě, ale i pro další studenty
a zájemce o dané téma. Věřím, že znalosti, dovednosti a získané zkušenosti, které jsem
získala touto diplomovou prací, využiji při dalším vzdělávání a v hledání nabídek práce.
- 63 -
Zdroje:
[1] Vražedná matematika Sudoku. Praha : Egmond ČR, s.r.o., 2006. 144 s.
[2] Mistrovská Sudoku : Snadné i obtížné rébusy s 5 radami mistryně světa Jany
Tylové. Praha : Kanzelsberger, a.s., 2006. 168 s.
[3] Sudokuweb.cz : Magická hra, geniální hlavolam s jednoduchými pravidly [online].
2008 [cit. 2009-10-17]. SUDOKU. Dostupné z WWW: http://sudokuweb.cz
[4] Sudoku : Tisíce Sudoku jen pro Vás [online]. 2006 [cit. 2009-10-17]. SUDOKU.
Dostupné z WWW: http://sudoku.hu.cz
[5] Sudoku-hra.cz [online]. 2000 [cit. 2010-02-23]. Sudoku. Dostupné z WWW:
http://www.sudoku-hra.cz/index.php
[6] LHDelphi.wz.cz [online]. 2006 [cit. 2010-02-23]. Sudoku. Dostupné z WWW:
http://sudoku-lh.wz.cz
[7] Volny.cz [online]. 2008 [cit. 2010-10-17]. Jen takový malý příspěvek k řešení
sudoku. Dostupné z WWW: http://www.volny.cz/jiven
[8] THE PUZZLECLUB [online]. 2010 [cit. 2010-04-09]. Sudoku. Dostupné z WWW:
http://www.thepuzzleclub.com/sudoku.php
[9] Internetový magazín spisovatele, publicisty a badatele Jaroslava Chvátala [online].
24.11.2005 [cit. 2010-10-30]. Matrix 2001. Dostupné z WWW:
http://www.matrix-2001.cz/clanek-detail/898-fenomen-sudoku
[10] Online-sudoku.cz [online]. [cit. 2010-10-30]. O Sudoku. Dostupné z WWW:
http://www.online-sudoku.cz
- 64 -
[11] Sudoku. In Wikipedia : the free encyclopedia [online]. St. Petersburg (Florida):
Wikipedia Foundation, 1995, last modified on 22. 9. 2010 [cit. 2010-10-30].
Dostupné z WWW: http://cs.wikipedia.org/wiki/Sudoku
[12] Prófův svět [online]. 12. 02. 2007 [cit. 2010-11-02]. Magické čtverce. Dostupné z
WWW: http://profuvsvet.ic.cz/view.php?cisloclanku=2007020007
[13] Magic square. In Wikipedia : the free encyclopedia [online]. St. Petersburg
(Florida) : Wikipedia Foundation, 1995, last modified on 29.10.2010 [cit. 2010-11-
02]. Dostupné z WWW: http://en.wikipedia.org/wiki/Magic_square
[14] FUCHS, Eduard. Magické čtverce aneb Od knihy I-ťing k internetové současnosti
[online], 14.4.2004. 33 s. Diplomová práce. Masarykova univerzita. Dostupné z
WWW: http://bart.math.muni.cz/~fuchs/Efuchs/historie_pdf/mactv.pdf
[15] Latin square. In Wikipedia : the free encyclopedia [online]. St. Petersburg (Florida):
Wikipedia Foundation, 1995, last modified on 12.9.2010 [cit. 2010-11-02].
Dostupné z WWW: http://en.wikipedia.org/wiki/Latin_square
[16] FRAZER JARVIS, BERTRAM FELGENHAUER, Enumerating possible Sudoku
grids [online]. June 20, 2005. 7 s. Oborová práce. Department of Computer Science
TU Dresden, Germany & Department of Pure Mathematics University of Sheffield,
U.K. Dostupné z WWW: http://www.afjarvis.staff.shef.ac.uk/sudoku/sudoku.pdf
[17] Mathematics of Sudoku. In Wikipedia : the free encyclopedia [online]. St.
Petersburg (Florida) : Wikipedia Foundation, 1995, last modified on 6.11.2010 [cit.
2010-11-17]. Dostupné z WWW:
http://en.wikipedia.org/wiki/Mathematics_of_Sudoku
[18] Stanislava Kelemenová, Jana Míšaná, Jana Orsaghová. Algoritmizácia a
naprogramovanie hry Sudoku [online]. 2006. 42 s. Študentská vedecká konferencia.
Univerzita Komenského. Dostupné z WWW:
http://cyril.fmph.uniba.sk/mffuk/studium/svk/AI/kelemenova.pdf
- 65 -
[19] MATLAB - The Language Of Technical Computing [online]. 1994 [cit.
2011-02-03]. MathWorks. Dostupné z WWW:
http://www.mathworks.com/matlabcentral/fileexchange/8083-matlab-sudoku-solver
[20] The MathWorks, Inc. [online]. 1994 [cit. 2011-03-11]. MathWorks. Dostupné z
WWW: http://www.mathworks.com/
[21] Online Sudoku [online]. 2009 [cit. 2011-03-25]. SUDOKU ONLINE. Dostupné z
WWW: http://www.sudoku-online.mojeip.cz/
[22] MATLAB. In Wikipedia : the free encyclopedia [online]. St. Petersburg (Florida) :
Wikipedia Foundation, 1995, last modified on 17. března 2011 [cit. 2011-03-25].
Dostupné z WWW: http://cs.wikipedia.org/wiki/MATLAB.
[23] Latin Squares: Leonhard Euler, Quasigroup, Latin Square, Mathematics of Sudoku,
Graeco-Latin Square, R. C. Bose, Circulant Matrix, Books LLC, 2010
[24] Narendra Jussien: A to Z of Sudoku. Ecole des Mines de Nantes, Francie 2007
[25] Seymour S Block, Santiago A Tavares: Before Sudoku: The World of Magic
Squares. Oxford Univ., 2009
[26] Wei-Meng Lee:Programming Sudoku (Technology in Action).Apress, 2006