Kółko Programistyczne VIII LO im. Władysława IV

Transkrypt

Kółko Programistyczne VIII LO im. Władysława IV
Kółko Programistyczne VIII LO im. Władysława IV
Konkurs Programowania w Logo, autor: Krzysztof Piesiewicz
02.03.2013
Zadanie 1 (Nawiasy)
Wyrażeniem nawiasowym nazwiemy niepusty ciąg składający się z nawiasów otwierających i
zamykających. Wyrażenie nawiasowe jest poprawne, tylko wtedy, gdy każdy nawias otwierający można
sparować z nawiasem zamykającym, występującym po nim, tak aby ciąg nawiasów znajdujących się
pomiędzy nimi również był poprawnym ciągiem nawiasowym.
Np. ( ( ) ( ) ) ( ) jest poprawnym wyrażeniem nawiasowym, ale ) ( i ( ) ( już nie są.
Napisz funkcję Nawiasy :naw, gdzie :naw jest listą zawierającą nawiasy okrągłe - słowa "( i "). Wynikiem
funkcji jest długość najdłuższego, spójnego podciągu poprawnego wyrażenia nawiasowego utworzonego
przez nawiasy "( i "). Liczba nawiasów w liście :naw nie przekracza 1000. Uwaga: nawiasy kwadratowe,
tworzące listę [], będącą parametrem nie liczą się do poszukiwanego wyrażenia nawiasowego.
Wynikiem Nawiasy [) ) ) ) (]
Wynikiem Nawiasy [( ) ( ( ( )]
Wynikiem Nawiasy [( ) ( )]
Wynikiem Nawiasy [( ( ( ( ( ) ) ( )]
jest 0
jest 2
jest 4
jest 6
Wyjaśnienie: żadne wyrażenie nie jest poprawne
Wyjaśnienie: najdłuższym szukanym wyrażeniem jest ( )
Wyjaśnienie: najdłuższym szukanym wyrażeniem jest ( ) ( )
Wyjaśnienie: najdłuższym szukanym wyrażeniem jest ( ( ) ) ( )
Zadanie 2 (Liczby)
Napisz procedurę Liczby :lic :d, której efektem wywołania jest wyśrodkowany rysunek utworzony przez
koła zawierające w środku liczby z listy :lic. Parametr :lic jest listą liczb naturalnych, a :d średnicą
rysowanych kół. Liczba znajduje się dokładnie w środku koła.
WSKAZÓWKI: Aby liczba w kole miała odpowiednią wielkość i kształt, należy użyć procedury
wpiszTekst :t, która wypisuje standardową czcionką tekst :t na ekranie zaczynając od pozycji żółwia. W
celu odpowiedniego wyśrodkowania tekstu w kole, powinieneś użyć funkcji rozmiarTekstu :t, którego
wynikiem jest 4-elementowa lista liczb [szer wys liczba3 liczba4]. Dwie pierwsze liczby określają szerokość
i wysokość prostokąta, w którym znalazłby się tekst :t. Dwie ostatnie nie mają dla nas żadnego znaczenia.
Przykładowo efektem wywołania wpiszTekst 1234 jest:
wynikiem funkcji rozmiarTekstu 1234 jest [32 16 13 0].
(zauważ, że żółw nie zmienił swej pozycji), a
Możesz założyć, że:
 wyśrodkowana liczba z listy :lic zawsze zmieści się w kole o średnicy :d
 wyśrodkowany rysunek zmieści się na ekranie.
Pamiętaj jednak, że nie wolno Ci zmieniać ustawień czcionki, którą pisze żółw!
Efekt wywołania procedury Liczby [2 3 4 5 6 7 8 9 10] 30
Efekt wywołania procedury Liczby [1 434 54 2323 45453] 50
Strona 1 z 4
Kółko Programistyczne VIII LO im. Władysława IV
Konkurs Programowania w Logo, autor: Krzysztof Piesiewicz
02.03.2013
Zadanie 3 (Drzewo)
Drzewo to nieskierowany, spójny graf acykliczny (między każdą parą wierzchołków istnieje
tylko jedna droga bez powtórzeń).
Algorytm DFS (Przeszukiwanie grafu w głąb) jest pewnym sposobem odwiedzania
wszystkich wierzchołków grafu, zaczynając w wierzchołku startowym.
Kolejne kroki:
1. Gdy jesteśmy w jakimś wierzchołku to zaznaczamy go jako odwiedzonego i przechodzimy do
jednego z jego nieodwiedzonych sąsiadów i robimy dla niego to samo.
2. Gdy dla jakiegoś wierzchołka nie ma już nieodwiedzonych sąsiadów (wszyscy sąsiedzi mają już
status odwiedzonych) to wracamy się do wierzchołka, z którego przyszliśmy. Przechodzimy do
kroku 1.
3. Kończymy algorytm, gdy wrócimy do wierzchołka startowego i wszyscy jego sąsiedzi będą już
odwiedzeni.
Dla drzewa na rysunku powyżej, zaczynając w wierzchołku nr 1, przechodzimy do wierzchołka nr 2, z niego
do 5. Z 5 nie możemy nigdzie przejść dalej, więc wracamy się do 2. Z 2 musimy wrócić do 1. Potem
odwiedzamy 3. Idziemy do 4. Dla 4 niema już nieodwiedzonych sąsiadów, więc wracamy do 3.
Z 3 przechodzimy do 6. Następie z 6 wracamy się do 3, skąd wracamy dalej do 1 i tu kończymy
przeszukiwanie.
Po kolei zaznaczaliśmy wierzchołki jako odwiedzone: 1, 2, 5, 3, 4, 6 - jest to kolejność przeszukiwania DFS.
Algorytm BFS (Przeszukiwanie grafu w szerz) jest również pewnym sposobem odwiedzania wszystkich
wierzchołków grafu, zaczynając w wierzchołku startowym. W algorytmie tym potrzebujemy struktury
danych zwanej kolejką, która umożliwia nam wrzucenie elementu na jej koniec i zdjęcie z niej najwcześniej
wstawionego (pierwszego).
Kolejne kroki:
1. Na początku zaznaczamy wierzchołek startowy jako odwiedzony i wrzucamy go na pustą kolejkę.
2. Dopóki kolejka nie jest pusta powtarzamy następujące czynności:
 Bierzemy pierwszy wierzchołek z kolejki i wyrzucamy go z niej.
 Dla tego wierzchołka wrzucamy wszystkich jego nieodwiedzonych sąsiadów na koniec
kolejki i zmieniamy ich oznaczenia na odwiedzone.
W efekcie w 1. fazie algorytmu wrzucimy na koniec kolejki wszystkich sąsiadów 1 - czyli 2 i 3. Potem
zdejmujemy z początku kolejki 2 i wrzucimy 5 na jej koniec. Następnie bierzemy 3 i wrzucamy 4 i 6.
Później zabieramy z kolejki 5 i nic nie wrzucamy. Potem 4 i też nic nie dodajemy. Na koniec bierzemy 6 i
również nic nie wrzucamy. Kolejka jest pusta - przeszukiwanie zakończone. Wierzchołki odwiedziliśmy w
kolejności 1 2 3 5 4 6 - ten ciąg to kolejność przeszukiwania BFS.
Po wstępnym zapoznaniu powyższe algorytmy wydają się w miarę proste. Piotrek i Michał również tak
myślą - niestety błędnie. Co więcej twierdzą, że zadania na DFSa i BFSa są banalne, a oni doskonale znają
powyższe problemy i nic z tej tematyki nie może ich zaskoczyć. Autor zadań słysząc tę ignorancję dla
sposobów przeszukiwania grafu, aż zadrżał i postanowił udowodnić kolegom, że istnieją zadania na BFSa
i DFSa, które nie są wcale takie trywialne. W tym celu stworzył zadanie Drzewo. Liczy on oczywiście, że
nadesłane rozwiązania będą heurystykami, które zostaną obalone przez ułożone wcześniej bardzo złośliwe
testy. Ha ha ha. Piotrek i Michał bardzo by chcieli pokazać autorowi zadań, że się myli. Z pewnością
podejmą wyzwanie i zmierzą się Drzewem. Ty też możesz stawić czoła temu strasznemu zadaniu.
Strona 2 z 4
Kółko Programistyczne VIII LO im. Władysława IV
Konkurs Programowania w Logo, autor: Krzysztof Piesiewicz
02.03.2013
Zadanie:
W zadaniu mamy do czynienia z drzewem o n wierzchołkach ponumerowanych od 1 do n. Po naszym
drzewie przechodzą sobie specyficzne algorytmy BFS i DFS. Gdy są w jakimś wierzchołku to wybierają
kolejno nieodwiedzonych jeszcze sąsiadów zgodnie ze wzrostem ich numerów; tj. od najmniejszego do
największego. Oba algorytmy zapisują swoją kolejność odwiedzonych wierzchołków.
Napisz procedurę Drzewo :bfs :dfs, gdzie :bfs jest kolejnością przeszukiwania algorytmu BFS, a :dfs
kolejnością przeszukiwania DFS. Efektem wywołania procedury jest rysunek drzewa, które jest zgodne z
kolejnością przeszukiwań :bfs i :dfs. Do tego jeśli więcej drzew spełnia warunki zadania to narysowane
drzewo powinno mieć jak najmniejszą wysokość; tzn. że maksymalna odległość od korzenia (wierzchołka
startowego) do dowolnego wierzchołka ma być jak najmniejsza.
Rysunek i jego proporcje dla testu Drzewo [4 2 5 8 7 1 9 10 3 6] [4 2 7 5 1 9 10 8 3 6]
Rysunek powinien spełniać następujące warunki:
 Wierzchołki na rysunku powinny być podzielone na warstwy.
 W 1. warstwie (tj. na samej górze rysunku) znajduje się sam korzeń.
 W k-tej warstwie znajdują się wierzchołki odległe od korzenia o k - 1 krawędzi.
 Gdy w jakiejś warstwie znajdują się synowie różnych wierzchołków, to powinni być rysowani od
lewej do prawej w kolejności występowania ich ojców w warstwie wyżej.
 Synowie jednego wierzchołka powinni być rysowani od lewej do prawej w kolejności rosnącej po
numerach.
 Jeśli na danym poziomie jest tylko 1 wierzchołek to powinien znajdować się on na środku.
 Gdy jest ich więcej powinny zajmować szerokość równą 700 i mieć równe przerwy między sobą.
 Wysokość rysunku powinna wynosić dokładnie 400, a między kolejnymi warstwami powinny być
równe odstępy.
 Na rysunku pojedynczy wierzchołek to koło o średnicy 30 z wpisanym numerem. Wierzchołek
tworzy się tak samo jak pojedyncze koło z zadania 2.
 Krawędź między wierzchołkami leży na prostej wyznaczonej przez środki, połączonych nią
wierzchołków.
Strona 3 z 4
Kółko Programistyczne VIII LO im. Władysława IV
Konkurs Programowania w Logo, autor: Krzysztof Piesiewicz
02.03.2013
Możesz założyć, że:
 drzewo składa się z przynajmniej 2 wierzchołków, a maksymalnie z 30.
 poprawny rysunek właściwego drzewa zawsze zmieści się na ekranie i nie będzie miał nachodzących
na siebie elementów.
Efekt wywołania procedury Drzewo [4 3 5 1 2 8 7 6] [4 3 1 7 2 6 5 8]
Zadanie 4 (Trójkąt)
Jak wiesz z lekcji matematyki, na każdym trójkącie można opisać okrąg. Okrąg opisany na trójkącie zawiera
wszystkie jego trzy wierzchołki.
Napisz procedurę Trójkąt :a :b :c, której efektem wywołania jest narysowany trójkąt o wierzchołkach w
trzech niewspółliniowych punktach :a, :b, i :c, oraz okrąg opisany na tym trójkącie. Parametry :a, :b, i :c są
listami dwóch liczb całkowitych, oznaczających współrzędne [x y] wierzchołków trójkąta. Po narysowaniu
żółw powinien zaleźć się na pozycji [0 0]. Możesz założyć, że okrąg zawsze zmieści się na ekranie.
Efekt wywołania procedury
Trójkąt [0 0] [100 0] [0 100]
UWAGA:
(Żółwie na rysunkach znajdują się na pozycji [0 0])
Efekt wywołania procedury
Trójkąt [-50 50] [300 100] [0 150]
Strona 4 z 4