Table of Contents

HW01 Prohledávání do hloubky

 Trojský zámek, Praha

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).

Kontrola vstupu

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í:

Detekovanou chybu na chybovém výstupu vypište a program ukončete. Vypsané chybové hlášení je ukončeno koncem řádku (znakem \n).

Algoritmus řešení úlohy

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:

Časově nejefektivnější řešení budou bodově ohodnocena.

Kontrolní testy

Testovací soubory najdete zde.

Základní formát výstupu

Příklad 1 – blud_1_01

Vstup (stdin) Výstup (stdout) Chybový výstup (strerr) Návratová hodnota
#.#####
#.#####
#.#####
#.....#
#####.#
#!#####
#!#####
#!#####
#!!!!!#
#####!#
žádný 0

Příklad 2 – blud_1_02

Vstup (stdin) Výstup (stdout) Chybový výstup (strerr) Návratová hodnota
##.###
#.####
..#####
#..$$$.#
#.##.##
žádný
Error: Bludiste neni obdelnikove!
1

Příklad 3 – blud_1_03

Vstup (stdin) Výstup (stdout) Chybový výstup (strerr) Návratová hodnota
##.###
#.####
#.####
#..$$$
#.##.#
žádný
Error: Vstup neni vlevo nahore!
1

Příklad 4 – blud_1_04

Vstup (stdin) Výstup (stdout) Chybový výstup (strerr) Návratová hodnota
#.#####
#.#####
..#####
#..$$.#
#.#####
žádný
Error: Vystup neni vpravo dole!
1

Příklad 5 – blud_1_05

Vstup (stdin) Výstup (stdout) Chybový výstup (strerr) Návratová hodnota
#.##
#.##
..##
#..$
#..#
žádný
Error: Sirka bludiste je mimo rozsah!
1

Příklad 6 – blud_1_06

Vstup (stdin) Výstup (stdout) Chybový výstup (strerr) Návratová hodnota
#.#####
#.#####
..#####
#..$$.#
žádný
Error: Delka bludiste je mimo rozsah!
1

Příklad 7 – blud_1_07

Vstup (stdin) Výstup (stdout) Chybový výstup (strerr) Návratová hodnota
#.#####
#.#####
..#####
#..$$.#
#.###.#
žádný
Error: Bludiste obsahuje nezname znaky!
1

Příklad 8 – blud_1_08

Vstup (stdin) Výstup (stdout) Chybový výstup (strerr) Návratová hodnota
#.#####
#.#####
..#####
#.....#
#.###.#
žádný
Error: Bludiste neni oplocene!
1

Příklad 9 – blud_1_09

Vstup (stdin) Výstup (stdout) Chybový výstup (strerr) Návratová hodnota
#.#####
#.#####
#.#####
#....##
#####.#
žádný
Error: Cesta neexistuje!
1

Příklad 10 – blud_1_10

Vstup (stdin) Výstup (stdout) Chybový výstup (strerr) Návratová hodnota
#.#####
#.#####
#.#####
#....#
#####.#
žádný
Error: Bludiste neni obdelnikove!
1

Správnost výpočtu

Příklad 9 – blud_2_01

Vstup (stdin) Výstup (stdout) Chybový výstup (strerr) Návratová hodnota
#.#####
#.....#
#.....#
#.....#
#####.#
#!#####
#!....#
#.....#
#....!#
#####!#
žádný 0

Příklad 10 – blud_2_02

Vstup (stdin) Výstup (stdout) Chybový výstup (strerr) Návratová hodnota
#.#####
#.#####
#...###
#.....#
#####.#
#!#####
#!#####
#!..###
#..!!!#
#####!#
žádný 0

Příklad 11 – blud_2_03

Vstup (stdin) Výstup (stdout) Chybový výstup (strerr) Návratová hodnota
#.#####
#....##
#.##.##
#.....#
#####.#
#!#####
#!...##
#.##.##
#...!!#
#####!#
žádný 0

Příklad 12 – blud_2_04

Vstup (stdin) Výstup (stdout) Chybový výstup (strerr) Návratová hodnota
#.###############
#...#...........#
#.###.#####.#.#.#
#...........#...#
###############.#
#!###############
#!..#......!!!..#
#!###.#####.#.#.#
#!!!!!......#..!#
###############!#
žádný 0

Příklad 13 – blud_2_05

Vstup (stdin) Výstup (stdout) Chybový výstup (strerr) Návratová hodnota
#.##########
#..........#
#.#.######.#
#.#......#.#
#.#.####.#.#
#.#....#.#.#
#.#.#..#.#.#
#.#.#.##.#.#
#.#......#.#
#.######.#.#
#..........#
##########.#
#!##########
#!.........#
#.#.######.#
#.#......#.#
#.#.####.#.#
#.#....#.#.#
#.#.#..#.#.#
#.#.#.##.#.#
#.#......#.#
#.######.#.#
#.........!#
##########!#
žádný 0
Tyto testovací soubory najdete v přiloženém akchivu.

Další testy na správnost výpočtu jsou utajené.

Příklad 14 – Velké bludiště

Na následujícím příkladu lze testovat rychlost výpočtu na velkých bludištích. Bludiště není součástí testovací sady, ale podobá se časové náročným testům.

#.#############################
#..........................#..#
#.#####################.......#
#.............................#
##############.################
#................##..#...#...##
#############...###.##.#...#.##
#...................#..###.#.##
#################.####...#.####
#........................#....#
#.##########################..#
#.............................#
###########.#################.#
#.#.......#.#...#.#...#...#...#
#.#.#####.####..#.#.#.#.#.#.###
#.#.....#.......#.#.#.#.#.....#
#.###.#####.###.#.#.#.#.#.###.#
#.....#...#.#...#...#...#.#...#
#.....#.#...#.#########.#######
#.###.#.#.#.###.........#...#.#
#.....###.#...#.#########.#...#
#####...#####...#.........#...#
#.....###########....########.#
####.....##########.#######...#
########..........#.#.#.....#.#
#...####...########...#.#####.#
#.#.####.#####........#....##.#
#.#......####...###...###.###.#
#...######..#####...#####.###.#
###...............#######...#.#
#############################.#

Rychlost výpočtu

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í.

Odevzdání a hodnocení

Úlohu je možné řešit v programovacím jazyce Java, Python nebo C/C++.

Veřejné testovací soubory - DSA_HW01.

Název úlohy v BRUTE HW01
Odevzdávané soubory maze.py – zdrojový soubor v python3
Maze.java – zdrojový soubor v Java, název třídy Maze
maze.c, resp. maze.cpp – zdrojový soubor v C/Cpp
Argumenty programu žádné
Kompilace pro jazyk C
clang -Wall -Werror -pedantic -std=c99
clang -Wall -Werror -pedantic -std=c+ +17
Kompilace a spuštění
pro jazyk Java
javac *.java
java -classpath Maze
Očekávaná složitost lepší než $\mathcal{O}(n^4)$
Koeficient pro čas výpočtu $3.0$
Procvičované oblasti
prohledávání stavového prostoru do hloubky
backtracking
složitost úlohy a její optimalizace
Bodové hodnocení (celkem 10 bodů) 2 body blud_1_01 – blud_1_10 + 5 skrytých testů
3 body blud_2_01 – blud_2_05 + 3 skryté testy
5 bodů blud_3_01 – blud_3_20 – řešení časově stejné nebo lepší než referenční řešení
Maximální počet uploadů 20 Více uploadů je možných s odpovídající bodovou ztrátou