Search
Zahradník se stará o zahradní bludiště. Do bludiště přichází mnoho návštěvníků a zahradník nechce chod v bludišti omezovat na dlouhou dobu. Proto potřebuje vyhledat cesty, kterými při průchodu bludištěm musí projít každý návštěvník a pro úpravu kterých tudíž musí být bludiště uzavřené. Pomozte zahradníkovi tyto cesty v bludišti vyhledat.
Na vstupu je dáno obdélníkové bludiště – viz předloha níže. Šířka bludiště je dána počtem znaků na prvním řádku. Délka bludiště je dána počtem načtených řádků. Keře v bludišti, kterými jsou ohraničené cesty, jsou v bludišti označeny znakem #, průchozí místa znakem . (tečka). Do bludiště se vchází vlevo nahoře a vychází se vpravo dole.
#
.
Výstupem programu je bludiště, v němž jsou místa, kudy je nevyhnutné projít (dále označeno jako „hledaná místa“) vyznačena znakem ! (vykřičník).
!
Bludiště na vstupu kompletně načtěte. Zkontrolujte, zda je bludiště korektně zadané. Kontrola vstupu a případné vypsání chyby musí být provedeno v následujícím pořadí:
Error: Bludiste neni obdelnikove!
Error: Vstup neni vlevo nahore!
Error: Vystup neni vpravo dole!
Error: Sirka bludiste je mimo rozsah!
Error: Delka bludiste je mimo rozsah!
Error: Bludiste obsahuje nezname znaky!
Error: Bludiste neni oplocene!
\n
Cesty procházení bludištěm lze získat metodou prohledávání do hloubky s možností opravy, pokud vejdeme do „slepé“ uličky (backtracking). Tímto algoritmem dokážeme poměrně jednoduše najít jednu cestu bludištěm. Úloha požaduje prohledání stavového prostoru problému a vyhledání všech možných cest v bludišti tak, abychom dokázali vyhledat místa, kudy všechny cesty bludištěm prochází. Právě tato místa potřebuje zahradník znát, aby věděl, kdy má bludiště uzavřít.
Vzhledem k exponenciální časové složitosti tohoto postupu řešení problému je vhodné se zamyslet nad optimalizací řešení. Při hledání optimálního řešení mohou napomoci následující úvahy:
#.##### #.##### #.##### #.....# #####.#
#!##### #!##### #!##### #!!!!!# #####!#
##.### #.#### ..##### #..$$$.# #.##.##
##.### #.#### #.#### #..$$$ #.##.#
#.##### #.##### ..##### #..$$.# #.#####
#.## #.## ..## #..$ #..#
#.##### #.##### ..##### #..$$.#
#.##### #.##### ..##### #..$$.# #.###.#
#.##### #.##### ..##### #.....# #.###.#
#.##### #.....# #.....# #.....# #####.#
#!##### #!....# #.....# #....!# #####!#
#.##### #.##### #...### #.....# #####.#
#!##### #!##### #!..### #..!!!# #####!#
#.##### #....## #.##.## #.....# #####.#
#!##### #!...## #.##.## #...!!# #####!#
#.############### #...#...........# #.###.#####.#.#.# #...........#...# ###############.#
#!############### #!..#......!!!..# #!###.#####.#.#.# #!!!!!......#..!# ###############!#
#.########## #..........# #.#.######.# #.#......#.# #.#.####.#.# #.#....#.#.# #.#.#..#.#.# #.#.#.##.#.# #.#......#.# #.######.#.# #..........# ##########.#
#!########## #!.........# #.#.######.# #.#......#.# #.#.####.#.# #.#....#.#.# #.#.#..#.#.# #.#.#.##.#.# #.#......#.# #.######.#.# #.........!# ##########!#
Další testy na správnost výpočtu jsou utajené.
Rychlost je srovnávána v opakovaných testech s rychlostí (časem) výpočtu referenčního řešení. Bodově jsou hodnocena řešení, která potřebují čas menší než je trojnásobek času referenčního řešení.
Java
Python
C/C++
Veřejné testovací soubory - DSA_HW01.
main.py
Maze.java
main.c
main.cpp
clang -Wall -Werror -pedantic -std=c99 clang -Wall -Werror -pedantic -std=c+ +17
javac *.java java -classpath Maze
prohledávání stavového prostoru do hloubky backtracking složitost úlohy a její optimalizace
20