====== Kdo je kdo? ======
Kamarádi z vojny, Jarda, Mirek, Luďa, Béďa, Čeněk, Mates a Kvído mají sraz po mnoha letech a na závěr si udělají společné foto. Vzpomenou si na svého bývalého velitele a fotku mu pošlou. S trochou škodolibosti mu ovšem neprozradí přímo, kdo je kde na obrázku. Poskytnou mu pouze nápovědu, která ho při troše důvtipu dovede k cíli.
{{:2014_15:priklad_anonymni.jpg?nolink&300|}}
** Obrázek 1.** Fotka beze jmen.
**Nápověda** se skládá z kusých informací typu:
* jakou barvu kalhot má/nemá daná postava
* jakou barvu košile má/nemá daná postava
* kdo s kým přímo sousedí/nesousedí
* kdo je nalevo/napravo od koho
**Příklad** nápovědy k Obrázku 1:
* Jarda má modré kalhoty
* Kvído má červené kalhoty
* Luďa nemá modré kalhoty
* Mirek má žlutou košili
* Béďa má hnědou košili
* Čeněk má žlutou košili
* Mates nemá červenou košili
* Jarda sousedí s Mirkem
* Béďa nesousedí s Mirkem
* Mirek je nalevo od Ludi
* Čeněk je nalevo od Bédi
* Kvído je nalevo od Jardy
* Luďa je napravo od Kvída
Poznáš kdo je kdo podle zadané nápovědy? (Pro ověření, zde je [[2017_2018:kdo_je_kdo:reseni|řešení]])
====== Úloha ======
Je dána posloupnost postav v pořadí, v jakém se vyskytují na fotce. Každá postava je definovaná barvou kalhot a barvou košile.
Dále je definována množina omezení, která musí být všechna splněna.
Cílem je nalézt přiřazení pozic všem postavám tak, aby byla dodržena všechna definovaná omezení.
===== Vstup =====
Vstupní soubor obsahuje dva řádky
* seznam jmen oddělených mezerami
* seznam barev použitých v úloze
následováno seznamem postav, uvozeným řádkem s textem "postavy:", v pořadí jak jsou na obrázku (z pohledu pozorovatele),
kde
* každá postava je definována na jednom řádku dvojicí "barva_kalhot-barva_košile"
následováno seznamem omezení těchto typů
* sousedi(jmeno1, jmeno2) ... vazba, vyjadřující, že jmeno1 sousedí s jmeno2
* nesousedí(jmeno1, jmeno2) ... jmeno1 NEsousedí s jmeno2
* nalevood(jmeno1, jmeno2) ... jmeno1 je na obrázku nalevo od jmeno2
* napravood(jmeno1, jmeno2) ... jmeno1 je napravo od jmeno2
* maKosiliBarvy(jmeno, barva) ... postava jmeno ma kosili barvy barva
* nemaKosiliBarvy(jmeno, barva) ... postava jmeno NEma kosili barvy barva
* maKalhotyBarvy(jmeno, barva) ... postava jmeno ma kalhoty barvy barva
* nemaKosiliBarvy(jmeno, barva) ... postava jmeno NEma kalhoty barvy barva
Ne všechna omezení musí být v dané úloze definována.
Příklad vstupního souboru k Obrázku 1:
Jarda Mirek Luda Beda Cenek Mates Kvido
zluta hneda cervena modra
postavy:
hneda-modra
cervena-hneda
modra-zluta
modra-cervena
cervena-zluta
zluta-hneda
zluta-zluta
omezeni:
sousedi(Jarda, Mirek)
nesousedi(Beda, Mirek)
nalevoOd(Mirek, Luda)
nalevoOd(Cenek, Beda)
nalevoOd(Kvido, Jarda)
napravoOd(Luda, Kvido)
maKosiliBarvy(Mirek, Zluta)
maKosiliBarvy(Beda, hneda)
maKosiliBarvy(Cenek, zluta)
nemaKosiliBarvy(Mates, cervena)
maKalhotyBarvy(Jarda, modra)
maKalhotyBarvy(Kvido, cervena)
nemaKalhotyBarvy(Luda, modra)
===== Výstup =====
Výstupem je právě jedno řešení zapsané jako permutace celých čísel od 0 do N-1 (N je počet postav vystupujících v dané úloze),
podle které jsou postavám v pořadí, v jakém byly uvedeny ve vstupním souboru, přiřazeny pozice, na kterých se mají vyskytovat na fotce.
Příklad správného výstupu k úloze definované v ukázkovém vstupním souboru viz výše (pozor: čísluje se od 0):
3 2 6 5 4 0 1
Takže tato posloupnost čísel přiřazuje pozice postavám ze vstupní posloupnosti "Jarda Mirek Luda
Beda Cenek Mates Kvido" následujícím způsobem:
- Jarda je na fotce na pozici 3
- Mirek je na pozici 2
- Luda je na pozici 6
- Beda je na pozici 5
- Cenek je na pozici 4
- Mates je na pozici 0
- Kvido je na pozici 1
Porovnej s [[2014_15:kdo_je_kdo:reseni|Obrázkem 2]].
===== Zadání a řešení =====
* Stáhněte si soubory {{:2014_15:zadani.zip|zadani1.txt a zadani2.txt}}. Každý soubor obsahuje zadání jedné úlohy ve formátu viz výše. Nelepkněte se, pro jednoduchost jsme volili krátká (jakoby čínská) jména :-)
* Vytvořte výstupní textové soubory **reseni1.txt** a **reseni2.txt** s řešením zapsaným dle formátu viz výše.
* Soubory s výsledky zazipujte do jednoho archivu s příponou .zip (na jeho jménu nesejde) a odevzdejte do [[https://hapky.fel.cvut.cz/sou/assignments.php| odevzdávacího systému Hapky]]. **POZOR: Řešení můžete odevzdávat opakovaně. Pokaždé však zabalte obě řešení, pokud je máte.**
===== Pomůcky a tipy =====
Zde si můžete stáhnout {{:2014_15:kdojekdo_src.zip|základní třídy napsané v Javě}} pro načtení zadání hádanky a další jednoduché operace, včetně třídy s jednoduchým řešičem, který je ovšem tak jednoduchý, že správné řešení nenajde :-)
* Třída [[2017_2018:kdo_je_kdo:tridahadanka|Hadanka]] obsahuje struktury pro popis daného zadání hádanky, tj. seznam jmen, použité barvy, seznam postav (zadané barvou kalhot a košile) v daném pořadí, a všechna omezení, která musí být splněna.
* Třída [[2017_2018:kdo_je_kdo:tridareseni|Reseni]] reprezentuje řešeni ve formě seznamu dvojic .
* Třída [[2017_2018:kdo_je_kdo:tridanahodny|Nahodny]] realizuje náhodný řešič, který řešení sestaví náhodným tipováním pozice každého jména.
* Třída [[2017_2018:kdo_je_kdo:tridamain|Main]] ukazuje, jak se vytvoří objekt typu Hadanka, který načte zadání, zpracuje všechna omezení a spustí náhodný řešič.
Při návrhu řešení se můžete inspirovat metodami prohledávání stavového prostoru, viz
* [[http://cs.wikipedia.org/wiki/Prohled%C3%A1v%C3%A1n%C3%AD_do_%C5%A1%C3%AD%C5%99ky|prohledávání do šířky]] a
* [[http://cs.wikipedia.org/wiki/Prohled%C3%A1v%C3%A1n%C3%AD_do_hloubky|prohledávání do hloubky]].
===== Hodnocení =====
Celkově můžete získat za tuto úlohu 20 bodů rozdělených takto
* 7 bodů za správně vyřešené zadání 1
* 13 bodů za správně vyřešené zadání 2.