V praktických úlohách P-I-2, P-I-3 a P-I-4 je třeba k řešení připojit odladěný program zapsaný v jazyce Pascal, C nebo C++. Program se odevzdává v písemné formě (jeho výpis je tedy součástí řešení) i na disketě, aby bylo možné otestovat jeho funkčnost. Slovní popis řešení musí být ovšem jasný a srozumitelný i bez toho, že by bylo nutno nahlédnout do zdrojového textu programu. V úloze P-I-1 se odladěný program nepožaduje, stačí uvést dostatečně podrobný zápis algoritmu. V úloze P-I-4b nakreslete místo programu navrženou komparátorovou síť.
Řešení úloh domácího kola MO kategorie P vypracujte a odevzdejte nejpozději do 15.11.2001. Vzorová řešení úloh naleznete po tomto datu na Internetu na adrese http://mo.mff.cuni.cz. Na stejném místě jsou stále k dispozici veškeré aktuální informace o soutěži a také archív soutěžních úloh a výsledků minulých ročníků.
P-I-1 Matice
Je dána čtvercová matice A o rozměrech n x n, jejíž prvky
jsou nuly a jedničky. Pojmem řádková resp. sloupcová
výměna budeme označovat vzájemnou záměnu libovolných dvou řádků,
resp. libovolných dvou sloupců matice. Bude nás zajímat, zda je
možné posloupností řádkových a sloupcových výměn převést danou
matici A na takovou matici, která má na hlavní diagonále pouze
jedničky (hlavní diagonálu tvoří prvky A[1,1], A[2,2], ..., A[n,n]).
V mnoha aplikacích (např. při řešení soustav lineárních rovnic) je výhodné danou matici transformovat na ekvivalentní matici tak, aby hlavní diagonála obsahovala "velké" prvky. V této úloze vlastně nuly reprezentují "malé" a jedničky "velké" prvky matice.
P-I-2 Robot
Ve výzkumném ústavu potrubí a rour vyvinuli nový druh robota
určeného na čištění teplovodních potrubí. Robot se soustavou
potrubí pohybuje podle předem stanoveného plánu. Technologie
čištění vyžaduje, aby robot prošel každou trubkou v soustavě
dvakrát (nezáleží na tom, jakým směrem) - při prvním průchodu
provádí chemické čištění a při druhém mechanické dočišťování.
Robot může vlézt do trubky z kteréhokoliv konce, ale jakmile do
ní vstoupí, musí ji už celou projít.
Soustava potrubí se skládá z n uzlů očíslovaných od 1 do n, mezi nimiž vede m teplovodních trubek očíslovaných od 1 do m. Každá trubka vede mezi dvojicí uzlů a nemá žádné odbočky ani větvení. Mezi každou dvojicí uzlů vede nejvýše jedna trubka. Soustava potrubí je souvislá, tzn. robot se trubkami může dostat na libovolné místo soustavy. Robot začíná svou práci v uzlu číslo 1 a po skončení čištění se musí opět do tohoto uzlu vrátit.
robot.in
obsahuje dvě kladná
celá čísla n a m (n<=100), oddělená jednou mezerou. Každý
z následujících m řádků popisuje jednu trubku. Obsahuje vždy
dvě kladná celá čísla oddělená mezerou - čísla koncových uzlů
této trubky.
robot.out
je tvořen jediným řádkem, který
obsahuje 2m+1 čísel uzlů oddělených mezerami. Jsou to čísla
uzlů v pořadí, v jakém je má robot navštívit během svého čištění.
První a poslední číslo na řádku musí být 1. V případě, že
neexistuje trasa, která prochází každou trubkou právě dvakrát,
výstupní soubor bude obsahovat jediný řádek se slovem NE
.
Pokud existuje více vhodných tras, vypište jednu libovolnou
z nich.
robot.in
:robot.out
:primka.in
přečte souřadnice bílých a černých bodů a do výstupního souboru
primka.out
vypíše jednu spravedlivou přímku.Můžete předpokládat, že žádné tři zadané body neleží na jedné přímce a že bod [0,0] neleží na žádné přímce určené dvěma zadanými body. Všechny zadané body mají celočíselné souřadnice.
primka.in
obsahuje jediné
číslo n. Každý z následujících 2n řádků obsahuje souřadnice
jednoho zadaného bodu oddělené mezerou. Prvních n bodů je
bílých, dalších n bodů je černých.
primka.out
je tvořen jediným řádkem, který
obsahuje souřadnice jednoho libovolného bodu různého od [0,0],
jímž nalezená spravedlivá přímka prochází. Souřadnice jsou od
sebe odděleny jednou mezerou. Pokud spravedlivá přímka pro
zadanou množinu bodů neexistuje, výstupní soubor bude obsahovat
jediný řádek se slovem NE
.
primka.in
:
P-I-4 Komparátorové sítě
Komparátorové sítě se využívají při návrhu paralelních algoritmů.
Mohou se také snadno realizovat pomocí elektronických obvodů.
Komparátor je jednoduché zařízení, které obdrží na vstupu
dvě čísla, porovná je, na vrchním ze svých výstupů vrátí menší
z těchto dvou čísel a na spodním větší z nich. Z komparátorů lze
sestavovat složitější obvody, kterým budeme říkat komparátorové
sítě.
Komparátorová síť je tvořena n vodorovně uspořádanými vodiči, které jsou na několika místech propojeny pomocí komparátorů. Komparátory jsou uspořádány do vrstev, které odpovídají jednotlivým krokům výpočtu. Na začátku výpočtu (v kroku 0) síť dostane na vstupu n čísel. Po skončení kroku k-1 se výstupy z kroku k-1 přenesou vodiči na komparátory ve vrstvě k. Komparátor ve vrstvě k spojuje vždy dva vodiče (nemusí to ovšem být sousední vodiče). Jestliže je na spodním z nich menší hodnota než na vrchním, vymění tyto hodnoty, v opačném případě je nechá beze změny. V jedné vrstvě může být umístěno i více komparátorů (jejich výpočet probíhá najednou, paralelně), ale v jedné vrstvě může jeden vodič vstupovat nejvýše do jednoho komparátoru. Po skončení celého výpočtu jsou na výstupech sítě tatáž čísla jako na jejích vstupech, pouze může být zaměněno jejich pořadí.
Graficky se vodiče zobrazují jako vodorovné čáry, komparátory jako svislé spojnice svých vstupních vodičů. Komparátory umístěné v jedné vrstvě se kreslí svisle nad sebe, případně do několika sousedních sloupců. Jednotlivé vrstvy sítě oddělujeme svislou čárkovanou čarou. Výpočet komparátorové sítě probíhá zleva doprava.
Při návrhu sítí se snažíme sestrojit je tak, aby doba výpočtu byla co nejmenší, tj. aby síť měla co nejméně vrstev. Druhým kritériem hodnocení kvality sítě je počet použitých komparátorů (na tomto počtu může záviset například výrobní cena sítě).
Všimněte si, že hloubka rekurze je log2n, neboť velikost
vstupu se v každém rekurzívním kroku sníží na polovinu. Každá
úroveň rekurze přidá do výsledné sítě jednu vrstvu, takže síť
Sn má log2n vrstev. Počet použitých komparátorů je
v poslední vrstvě 1, v každé další vrstvě odzadu se vždy
zdvojnásobí. Nechť počet vstupů je n=2k. Potom počet použitých
komparátorů je 1+2+4+...+2k-1=2k-1=n-1 (součet
geometrické posloupnosti). Získali jsme tedy síť, která má
O(log n) vrstev a používá O(n) komparátorů.