Zadání úloh ústředního kola (1. soutěžní den) 44. ročníku
P-III-1
Typizované krychle ve třírozměrném prostoru jsou pro účely uchování
informace v počítači kódovány nezápornými přirozenými čísly složenými
z číslic 1..8. Souřadná soustava, v níž je umístěna základní typizovaná
krychle, má počátek v jejím těžišti a souřadné osy jsou kolmé na stěny
krychle. Souřadné roviny xy, yz a xz ji rozdělí na 8 menších typizovaných
krychlí. Je-li A[x,y,z] bod základní typizované krychle, přiřadíme
menší krychli, která ho obsahuje, podle znamének x, y, z kód dle
následující tabulky:
Kód krychle | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
x | + | - | - | + | + | - | - | + |
y | + | + | - | - | + | + | - | - |
z | + | + | + | + | - | - | - | - |
Každou z 8 takto vzniklých typizovaných krychlí lze rozdělit podobným
způsobem; kódy vzniklých krychlí dostaneme přidáním cifry (dle tabulky)
odpovídající pozici nově vzniklé krychle za pravý konec bezprostředně
nadřazené typizované krychle, tzn. jejich kódy budou 11, 12, ..., 88.
Tímto způsobem lze postupně dělit typizované krychle bez omezení.
Je dána množina typizovaných krychlí K. Průměty typizované krychle
do souřadných rovin xy, yz a xz (typizované čtverce) jsou kódovány
pouze kódy dané souřadné roviny, tzn. tak, jako by zbývající souřadnice byla
vždy kladná (například průměty typizovaných krychlí do roviny xy jsou kódovány
posloupnostmi číslic 1, 2, 3, 4, analogicky u ostatních rovin).
Nechť M a Mmin jsou 2 množiny typizovaných čtverců takové, že M je průmět
množiny typizovaných krychlí K do jisté souřadné roviny. Mmin je minimální
k M, jestliže platí současně
- M a Mmin pokrývají stejné oblasti v rovině
- Pro každou množinu M' typizovaných čtverců pokrývajících stejnou oblast
jako M je velikost M' větší nebo rovna velikosti Mmin
Vaší úlohou je pro množinu K typizovaných krychlí zadanou jejich kódy
určit minimální průměty do všech tří souřadných rovin.
Mějme bílý list ve tvaru obdélníka o šířce a cm a délce b cm (a<b) z nekonečně tenké
a absolutně pružné látky. Zavedeme souřadný systém tak, že má počátek v levém dolním
rohu papíru a osy jsou rovnoběžné s okraji listu. Tento obdélník je zdeformován
tak, že protilehlé delší okraje tohoto listu jsou slepeny a vznikne válec. Ten je dále
ohnut tak, že slepíme podstavy tohoto válce (překryv nutný ke slepení zanedbejte).
Vznikne prostorové těleso, připomínající pneumatiku (V matematice se takové
těleso nazývá toroid). Umístění souřadných os vůči původnímu listu přitom zůstane
zachováno. Na toto těleso je postupně pokládáno N obdélníků z nekonečně tenké a
pružné látky různých barev, jejich strany jsou rovnoběžné se souřadnými osami.
Po položení všech obdélníků jsou vidět obrazce různých barev. Dvě oblasti stejné barvy
považujeme za části téhož obrazce, mají-li společný alespoň jeden bod
(tj. stačí dotyk rohem). Vaší úlohou je určit plochu každého z těchto obrazců.
Zadání je uvedeno v následujícím tvaru:
- Nejprve jsou uvedeny hodnoty a, b, N (a, b, N >=1).
- Na každém z následujících N řádků jsou uvedeny údaje o jednom pokládaném
obdélníku v pořadí, v němž budou pokládány. Pro každý z nich jsou uvedeny
souřadnice levého dolního rohu, jeho šířka a délka a jeho barva (v intervalu
1..64, bílá barva pozadí má kód 1).
Výstupem programu jsou velikosti a barvy jednotlivých obrazců, setříděné
v rostoucím pořadí podle čísla barvy.
T-stroj je tvořen řídící jednotkou, která se může nacházet v konečně mnoha
stavech, a nekonečně dlouhou páskou, rozdělenou na jednotlivá pole. V každém
poli může být zapsán 1 symbol nějaké konečné abecedy, nebo může být prázdné,
tj. obsahovat speciální symbol
@
. Hlava T-stroje je umístěna vždy nad určitým
polem pásky a může se pohybovat vlevo nebo vpravo právě o 1 pole.
Výpočet T-stroje probíhá v taktech. Na začátku výpočtu je T-stroj v
počátečním stavu, na pásce je zapsána posloupnost znaků z dané abecedy
(vstupní slovo) a je stanovena poloha hlavy nad páskou. V každém
taktu výpočtu T-stroj přečte znak z pole pásky, nad nímž je umístěna
hlava, a na základě tohoto znaku a stavu řídicí jednotky (konfigurace
T-stroje) se zapíše nějaký znak dané abecedy do stejného pole, změní se
stav řídící jednotky a hlava se může posunout o 1 pole doleva nebo doprava,
případně zůstat na stejném poli. Zapsaný znak nemusí být součástí vstupní
abecedy - je možné používat pomocné symboly. Činnost T-stroje končí v
okamžiku, kdy vykoná instrukci STOP
nebo když není definováno, jak má
jeho činnost pokračovat pro příslušnou konfiguraci (znak+stav stroje).
Pokud se T-stroj zastaví, říkáme, že přepsal vstupní slovo na
výstupní slovo.
T-stroj může rozhodovat problémy, na které jsou možné odpovědi ano/ne.
Pokud se stroj při zastavení nachází v určitém pevně stanoveném stavu,
je odpověď ano, jinak ne.
Činnost T-stroje lze popsat řídícími strukturami podobnými Pascalu,
jmenovitě lze použít podmíněné příkazy a cykly typu repeat a while.
Návěští před příkazem značí stav T-stroje. Stav S0 je zpravidla počátečním
stavem. Jediná proměnná se jménem znak obsahuje znak pole, nad nímž je
hlava. Příkaz STOP ukončí výpočet T-stroje, rovněž tak, není-li uvedena
reakce na určitou konfiguraci.
Příklad
Zjistěte, zda kladné celé číslo, zapsané na pásce v binární číselné soustavě
je liché. Hlava je na počátku nad číslicí nejvyššího řádu, číslo pokračuje
směrem doprava. Zbytek pásky je obsazen znaky
@
.
Řešení
Sudost nebo lichost čísla v binární soustavě se pozná podle číslice nejnižšího
řádu. Je-li tato 1, odpovědí má být ano, jinak ne. Pro řešení naší úlohy
přesuneme hlavu nejprve nad první pole vpravo, obsahující znak
@
, tj. o 1
pozici za konec čísla (během tohoto přesunu obsah pásky neměníme, tj. pokaždé
na dané pole zapíšeme původní znak). Poté se vrátíme o jednu číslici zpět
a otestujeme ji. Je-li to 1, T-stroj zastavíme ve stavu S2 (odpovídajícím
odpovědi ano), jinak ve stavu S1 a odpověď je ne.
S0: if znak <> @ then right
else begin left; S1 end;
S1: if znak = 1 then S2 else STOP;
S2: STOP;
Příklad
Na pásce je nezáporné celé číslo n v binární soustavě, hlava je nad číslicí
nejvyššího řádu. T-stroj zapíše na pásku číslo n+1.
Řešení
T-stroj otestuje číslici nejnižšího řádu. Je-li to 0, zapíše místo ní 1 a
končí. Jinak ji přepíše na 0, posune hlavu o jeden znak doleva a celý
postup opakuje, dokud nenarazí na nulu nebo konec slova.
S0: if znak <> @ then right
else begin left; S1 end;
S1: if znak = 1 then begin znak:=0; left end
else begin znak:=1; S2 end;
S2: STOP
Z uvedených příkladů vyplývá, že přiřazovací příkaz znamená zápis do
pole pásky, nad nímž je hlava, a příkaz Sk změnu stavu stroje na Sk.
Reakci T-stroje na konfiguraci v daném taktu zapisujeme do bloku
begin
...
end
Unární číselná soustava
Celá nezáporná čísla mohou být na pásce T-stroje zapsána v unární
číselné soustavě jako posloupnosti znaků "/". Délka takové posloupnosti
je o 1 větší než hodnota čísla, tj. číslo 5 je zpasáno na pásce jako //////,
číslo 2 jako ///. Nula je zapsána jako /.
Soutěžní úlohy
Čísla jsou na pásce zapsána v unární číselné soustavě. Hlava je v obou
případech nad nejlevějším znakem vstupního slova.
- Vstupním slovem T-stroje je dvojice celých nezáporných čísel oddělených
znakem "*". T-stroj určí a na pásku zapíše v unární soustavě jako výstupní slovo
hodnotu jejich součinu.
Příklad
T-stroj přepíše vstupní slovo ////*/// na výstupní slovo /////// (3*2=6).
- Vstupním slovem T-stroje je dvojice celých kladných čísel oddělených
znakem "*". T-stroj určí a na pásku zapíše v unární soustavě jako výstupní slovo
hodnotu jejich největšího společného dělitele.
Příklad
T-stroj přepíše vstupní slovo ///////*///// na /// (NSD(6,4)=2).