Magické čtverce

Několik postřehů k řešení domácího úkolu a k programování obecně.

  1. 1. Program který odpoví NE na všech vstupech aniž by cokoliv zkoumal může mít sice v CodExu 60 % úspěch, ale neřeší danou úlohu. Není naším cílem přechytračit CodEx, ale naučit se řešit úlohy pomocí programování. Kód podobný tomuhle může být v budoucnu odměněn zápornými bonusovými body.
  2. 2. Pokud vstup nedává smysl, je v pořádku ho odmítnout (např. čtverec menší než 3x3). Obecně je dobré testovat jestli vstupní data mají nějaký smysl.
  3. 3. Princip early failure je užitečný a v rekurzivních úlohách může pomoct rychle vyřazovat nepřípustná řešení (např. dosazování velkých čísel dřív povede ke sporu s omezením na součet řádku/sloupce/diagonály). Čím dříve v rekurzi narazíme na spor, tím víc práce si ušetříme (odřízneme velký podstrom).
  4. 4. Pokud testujeme magii čtverců ve více fázích (řádky, sloupce, diagonály), porušení podmínky v jedné fázi nám umožňuje vynechat ostatní fáze testu a vrátit neúspěch rovnou.
  5. 5. Je dobré dělit kód programu do menších přehledných celků. Tento postup usnadňuje hledání chyb a má též další výhody.
  6. 6. Pojmenovávání proměnných, odsazování programových bloků a používání komentářů může zvýšit přehlednost kódu. Přehledný kód se pozná mimo jiné tak, že se v něm vyznám, když ho čtu s netriviálním časovým odstupem od data výroby.
  7. 7. Některé chyby lze lépe (tzn. dřív než vás na ně upozorní CodEx) odhalit, pokud si zapnete Runtime error checking. V Turbo Pascalu to lze provést zde: Pokud používáte Free Pascal, podívejte se třeba sem.

Problém přesného batohu

V zájmu opakování rekurze jsme řešili problém přesného batohu.

Problém: máme dáno číslo M (nosnost batohu) a posloupnost čísel V1,V2,...,Vn (hmotnosti věcí). Chceme zjistit, jestli existuje podmnožina věcí, které nám přesně naplní batoh.

Byly navrženy 3 různé způsoby jak reprezentovat batoh.

Na tabuli vznikl pseudokód funkce
rozhodni(batoh: array[1..max] of integer; start: integer): boolean;
která tvoří nejdůležitější část programu. Z nedostatku času nebyly bohužel zodpovězeny všechny dotazy. Dávám sem proto svou vlastní implementaci funkce rozhodni jako satisfakci.

Dodavatel mřížek

Na závěr cvičení byla zadána domácí úloha do CodExu. Rád bych upozornil, že limit počtu odevzdaných řešení je tentokrát stanoven na 10 ks.