Autorské riešenie
Najprv si nakreslíme obrázky herného plánu sudoku, pomocou ktorých postupne prídeme na to, ako máme prechádzať všetkými oblasťami, ktoré potrebujeme otestovať, či obsahujú všetky zadané farby. Pri overovaní riešenia sudoku sa testujú riadky, stĺpce a štvorcové oblasti.
Očíslujeme riadky a stĺpce hracieho plánu sudoku celými číslami od 0 do 3. Postupne otestujeme:
Vidíme, že testujeme vždy obdĺžnikové oblasti veľkosti 4 štvorčekov, ktoré začínajú a končia v štvorčekoch s uvedenými súradnicami. Predstavme si, že vieme otestovať každú z oblasti pomocou jednej funkcie overOblasť, ktorej výsledkom je hodnota "áno, ako oblasť obsahuje všetky zadané farby, resp. "nie, ak chýba niektorá farba. V procedúre over_riešenie na začiatku nastavíme premennú "chyby na 0 a pri každom negatívnom výsledku testovania ju zvýšime o 1. Po otestovaní všetkých oblastí prehlasíme, že vyfarbený hrací plánik je riešením sudoku, ak nebolo žiadne z testovaní negatívne. Procedúra over_riešenie by mohla vyzerať nasledovne: viem over_riešenie Teraz si ukážeme ako naprogramovať funkciu overOblasť, ktorá otestuje obdĺžnikovú oblasť určenú dvojicou štvorčekov [x0,y0] a [x1,y1]. Pri oblastiach s jedným riadkom, resp. jedným stĺpcom by stačilo na ich otestovanie použiť jeden cyklus. Pri testovaní štvorcových oblastí musíme použiť dva cykly, ktoré sa dajú použiť aj pri jednoriadkových, resp. jednostĺpcových oblastiach (vnútorný, resp. vonkajší cyklus sa vykonajú len raz). V tele vnorených cyklov sa budeme presúvať na všetky súradnice štvočekov zadanej oblasti a do zoznamu - premennej "farby budeme postupne pridávať farby všetkých štvorčekov zadanej oblasti. Na konci len otestujeme usporiadaný zoznam prečítaných farieb so zoznamom farieb [modrá zelená žltá červená]. Funkcia overOblasť so štyrmi parametrami :x0 :y0 :x1 :y1 môže vyzerať nasledovne: viem overOblasť :x0 :y0 :x1 :y1 Uvedené riešenie úlohy je prvoplánové, dá sa viac zovšeobecniť. Vo všeobecnejšom riešení zadáme ako parametre procedury - rozmer hracieho plánu sudoku, veľkosť štvorčeka, zoznam testovaných farieb. Poďme teraz určiť, aké rozmery hracích plánov môže mať hra sudoku. Pri testovaní riešenia sudoku musí mať každý riadok, stĺpec aj štvorcová oblasť rovnaký počet prvkov. Označme si písmenom n počet riadkov (stĺpcov, štvorcových oblastí) a písmenom v šírku, resp výšku štvorcovej oblasti. Štvorcová oblasť s rozmermi v×v štvorčekov obsahuje n štvorčekov. Aby bolo v celé číslo, musí byť číslo n druhou mocninou celého čísla, napr. 4, 9, 16, 25... Všeobecnejšie riešenie procedúry overRiešenie s parametrami vyzerá nasledovne: viem overRiešenie :n :krok :zadaneFarby Vo funkcii overVšetko postupne prechádzame riadkami, stĺpcami a štvorcovými oblasťami. Výpočet sa ukončí pri prvej oblasti, kde je výsledok testovania negatívny. Funkcia overVšetko vyzerá nasledovne: viem overVšetko výsledok "áno Funkcia overOblasť s parametrami vyzerá nasledovne: viem overOblasť :x0 :y0 :x1 :y1 výsledok utrieď :farby = utrieď :zadaneFarby Ďalším zovšeobecnenie riešenia úlohy by bolo zistenie si všetkých parametrov hracieho plánu sudoku (rozmeru hracieho plánu sudoku, zoznamu farieb, veľkosti štvorčeka) postupným prechádzaním obrázka bod po bode. Skoršie ukončenie výpočtu môžeme dosiahnuť, ak počas prechádzania jednotlivými štvorčekmi vybranej oblasti, testujeme, či práve načítaná farba štvorčeka nie je v zozname farieb už prejdených štvorčekov vybranej oblasti. Táto súťažná úloha je zameraná na použitie stratégií riešenia problémov - rozlož problém do podproblémov, nakresli si obrázok/tabuľku, najdi vzor a tiež na výpočty s karteziánskymi súradnicami, použitie príkazov opakovania, vetvenia, funkcií, údajového typu zoznam. Riešenie tejto úlohy sa dá využiť pri reálnom sudoku skeneri zostaveného z robotických stavebníc s využitím farebného svetelného senzoru a dvoch servomotorov. Vaše zaujímavé riešenia a najčastejšie chyby Do riešenia tejto úlohy pre expertov sa zapojilo 15 tímov. Len 2 tímy vyriešili túto úlohu na plný počet bodov - ikztzu, Nezapamatatelny, ktorým gratulujeme. V riiešeniach tejto úlohy sa vyskytli rôzne prístupy ako
V jednom riešení autori načítali celú hraciu plochu sudoku do jednej premennej ako zoznam zoznamov, ktorý potom postupne vyhodnocovali. Nedostatky, ktoré sme našli v riešeniach súťažiacich:
|
||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |