Zápočtový program na předmět Programování I.
Jan Hlaváč (skupiny 38), LS 2006

Dokumentace k programu

Zadání

Napsat program generující zadání k oblíbenému hlavolamu SUDOKU.

Ovládání

Program se pouze spustí, po vygenerování SUDOKU vypíše na obrazovku výsledek a ukončí se stisknutím klávesy.
Zadání hlavolamu program uloží do souboru supoku_zadani.ss. V tomto formátu ho lze načíst v programu Simple Sudoku (ttp://angusj.com/sudoku/), ve kterém je lze snadno řešit.
Řešení hlavolamu je uloženo do souboru supoku_reseni.ss.

Idea řešení

Bylo potřeba zajistit dvě věci:

Podrobnější popis programu

Program má pevně stanovený počet a rozmístění políček v zadání (tzv. modrá pole). Dále si uchovává infromace o již vygenerovaných číslech a o zablokovaných polích.
V devíti cyklech se vygeneruje vždy po jedné sadě čísel, která se uloží. Generování probíhá tak, že se vygenerují rekurzivně všechny možnosti kombinací sad, jaké v poli mohou být (bere se v úvahu vlastnosti sudoku a již obsazená pole z již vygenerovaných sad). Z těch se vyberou ty, které splňují podmínky (nastavené napevno, kolik čísel ze sady bude v zadání) a následně se zkontroluje, jestli je sada svými modrými čísly určená jednoznačně. Pokud ano, uloží se do pole. Z něj je pak na konci generování náhodně jedna sada vybrána.

Hodnocení

Program generuje pouze lehká sudoku. Pro těžší sudoku, by bylo potřeba doplnit další metody řešení sudoku, které jsou použity na každou sada, při zjišťování zda je sada jednoznačná. Zároveň by bylo potřeba dát na výběr různé možnosti počtu polí a jejich rozmístění v zadání. To lze i teď, ale vzhledem k jednoduchému řešiteli by při menším počtu polí trvalo řešení příliš dlouho.

V programu jsou zadané podmínky, pro počet modrých čísel v každé sadě. To je tak trochu problém, jakým způsobem je nastavit. Na začátku být musí, aby první sadu bylo možné vůbec určit. Jestli jich použít víc na začátku nebo na konci, na to jsem nepřišel. Pro jiný počet modrých polí v zadání by se ale musely podmínky upravit. Zřejmě by jimi šlo i trochu ovlivnit složitost.