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