Řešení každého příkladu musí obsahovat popis použitého algoritmu, zdůvodnění jeho správnosti, diskusi o efektivitě zvoleného řešení (tzn. posouzení časových a paměťových nároků programu) a odladěný program. Slovní popis řešení musí být jasný a srozumitelný i bez toho, že by bylo třeba nahlédnout do samotného programu. Program může být napsán v jazyce Pascal nebo C. Odevzdává se s řešením každé úlohy v písemné formě i na disketě, aby bylo možné v případě nejasností otestovat jeho funkčnost. Více řešitelů z téže školy může odevzdat své programy na společné disketě (v tom případě rozdělte soubory jednotlivých řešitelů do podadresářů). Zaslané diskety vám budou po vyhodnocení domácího kola soutěže vráceny zpět.
Řešení úloh domácího kola MO kategorie P studenti zašlou k hodnocení prostřednictvím své školy příslušnému oblastnímu výboru matematické olympiády nejpozději do 10.12.1996.
P-I-1
Napište a odlaďte program na řešení známé "hry 15". V této
hře je ve čtvercové tabulce velikosti 4x4 políčka rozloženo 15
hracích kamenů označených čísly 1,2,...,15. Každý kámen leží
v jednom políčku tabulky, zbývající šestnácté políčko zůstává
prázdné. Povoleným tahem ve hře je přesunutí jednoho kamene na
sousední prázdné políčko v tabulce, a to ve směru svislém nebo
vodorovném. Každý přípustný tah je zřejmě jednoznačně určen
pořadovým číslem políčka, na kterém stál kámen před svým
přesunem. Políčka v tabulce budeme číslovat od 1 do 16 po řádcích
počínaje od levého horního rohu. Například ze situace A můžeme
tahem 6 přejít do situace B:
7 | 12 | 9 | 3 |
15 | 14 | 10 | |
1 | 8 | 13 | 5 |
11 | 6 | 2 | 4 |
7 | 12 | 9 | 3 |
15 | 14 | 10 | |
1 | 8 | 13 | 5 |
11 | 6 | 2 | 4 |
1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 |
13 | 14 | 15 |
Program přečte ze souboru P-I-1.INP
počáteční situaci jako
posloupnost čísel kamenů oddělených mezerami (prázdné políčko je
označeno číslem 0). Například situace A by byla popsána vstupní
posloupností 7 12 9 3 15 14 0 10 1 8 13 5 11 6 2 4
. Pokud
koncová situace není pomocí povolených tahů dosažitelná, program
vypíše do výstupního souboru P-I-1.OUT
zprávu Nemá řešení
.
Jestliže koncová situace je dosažitelná, program uloží do
výstupního souboru P-I-1.OUT
jednu (kteroukoliv) posloupnost
povolených tahů, která vede ke koncové situaci K. Kromě toho
program vykreslí celou tabulku hry a pomocí semigrafiky nebo
v grafickém režimu znázorní posloupnost tahů vedoucí do koncové
situace. Toto vykreslení by mělo být interaktivně krokovatelné -
například po každém stisku mezerníku by se měl na obrazovce
provést jeden tah výsledné posloupnosti.
Řekneme, že dvě neprázdné disjunktní množiny bodů A, B v rovině jsou separovatelné (oddělitelné), jestliže existuje přímka, která rozdělí rovinu na dvě poloroviny tak, že v každé polorovině se nacházejí jen body jedné z množin. Oddělující přímka může obsahovat body jen jedné množiny (případně na ní neleží žádný bod množin A, B).
Na vstupu jsou zadány dvě neprázdné disjunktní schodovité množiny bodů A a B. Vytvořte co nejefektivnější algoritmus a napište program, který zjistí, zda jsou množiny bodů A, B separovatelné. Pokud obě množiny jsou separovatelné, program určí jejich oddělující přímku.
Vstupní soubor P-I-2.INP
obsahuje nejprve řádek se dvěma
celými kladnými čísly M a N, která udávají počty prvků množin A,
B. Potom následuje M řádků, z nichž každý obsahuje dvě reálná
čísla - souřadnice jednotlivých bodů množiny A. Dalších N řádků
stejného tvaru udává souřadnice bodů množiny B. Seznamy bodů
množin A a B jsou uspořádány vzestupně podle hodnot první
souřadnice. Můžete předpokládat, že vstupní data jsou zadána
korektně.
Výstupem programu (v souboru P-I-2.OUT
) je jeden řádek
obsahující tři reálná čísla A, B, C oddělená mezerami. Tato čísla
představují koeficienty některé oddělující přímky Ax + By +
C =0. V případě, že oddělující přímka neexistuje, výstupem je
trojice čísel 0 0 0.
Předpokládejme například, že cestujeme ze státu 1 do státu 3 a měny států 1, 2 a 3 se jmenují vony, tugriky a dongy. Jestliže za 1 von dostaneme 1,50 tugriku nebo 1,25 dongu a za 1 tugrik dostaneme 0,90 dongu, je výhodnější vyměnit vony nejdříve za tugriky a potom takto získané tugriky za dongy (za sto vonů tak dostaneme 135 dongů namísto 125 dongů, které bychom obdrželi přímou výměnou).
Napište a odlaďte program, který po načtení tabulky výměnných kurzů K dokáže odpovídat na otázky typu "jaký je nejvýhodnější (přímý nebo nepřímý) výměnný kurz při cestě ze státu I do státu J".
Vstupem programu (v souboru P-I-3.INP
) je:
P-I-3.OUT
) bude P kladných
reálných čísel, která představují nejvýhodnější výměnné kurzy pro
jednotlivé cesty. Reálná čísla vypisujte s přesností na dvě
desetinná místa.
Vstupy a výstupy celého obvodu, stejně jako vstupy a výstupy jednotlivých hradel, se mohou nacházet v jednom ze dvou logických stavů 0 (false) nebo 1 (true). Výpočet obvodu je taktován. Jestliže jsou vstupy hradla H v čase t v logických stavech x[t] (příp. y[t]), výstup hradla H bude v čase t+1 v logickém stavu z[t+1] určeném vstupy a typem hradla. Pokud je na tento výstup napojen například vstup x' hradla H', bude v čase t+1 vstup x' v logickém stavu z[t+1], tzn. logický stav se po spojnicích šíří bez zdržení.
Budeme používat tři typy hradel: NAND, NOR (se dvěma vstupy)
a NOT (s jedním vstupem). Závislost výstupu těchto tří typů
hradel na vstupech je popsána následující tabulkou:
x[t] | y[t] | z[t+1] |
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
x[t] | y[t] | z[t+1] |
0 | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 0 |
x[t] | z[t+1] |
0 | 1 |
1 | 0 |
I1 | I2 | O1 | O2 |
0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 |
1 | 0 | 0 | 1 |
1 | 1 | 1 | 1 |