120 likes | 289 Vues
IV OTWARTE MISTRZOSTWA OPOLA W PROGRAMOWANIU ZESPOŁOWYM. OMÓWIENIE ZADAŃ. Problem B – Wędrujący klocek. Cechy klocka: Pozycja Położenie, np. lewy, dolny róg Cechy trasy: Pola odwiedzone przez klocek Ruch: Cztery możliwości. Pozycja 1. Pozycja 2. Pozycja 3.
E N D
IV OTWARTE MISTRZOSTWA OPOLAW PROGRAMOWANIU ZESPOŁOWYM OMÓWIENIE ZADAŃ
Problem B – Wędrujący klocek • Cechy klocka: • Pozycja • Położenie, np. lewy, dolny róg • Cechy trasy: • Pola odwiedzone przez klocek • Ruch: • Cztery możliwości Pozycja 1 Pozycja 2 Pozycja 3 3 pozycje x 4 kierunki = 12 wariantów
Problem B – Wędrujący klocek • Kolejny ruch: • Wyznacz nową pozycję • Wyznacz nowe położenie klocka • Dodaj zajmowane przez klocek pola do listy pól odwiedzonych Pozycja 1 Pozycja 2 Pozycja 3 N, y++ W, x-=dl_kl Pozycja 2 E, x++ S, y- - W, x- - E, x+=dl_kl Pozycja 1 S, y- - N, y+=dl_kl S, y-=dl_kl W, x- - N, y++ Pozycja 3 Ile razy najczęściej klocek znajdował się na jednym polu? Listę odwiedzonych pół przeszukujemy w czasie kwadratowym szukając współrzędnych, które występują najczęściej E, x++
Problem C – Zagnieżdżone podzbiory Gramatyka bezkontekstowa definiująca zagnieżdżony zbiór liczb naturalnych: Produkcje gramatyki L { E D Lista E N | L Element listy D , E D |} Rozwinięcie listy N NC | C Liczba naturalna C 0 | 1 | 2 | … | 9 Cyfra {1,2,{3,4,{5,6},7,8}} Przykładowe słowo realizowane przez gramatykę Reguły konstrukcji parsera dla gramatyk bezkontekstowych: A B CA() { B() C() } A B | C A() { Jeżeli (Pierwszy symbol (B) = s1) B() W przeciwnym wypadku jeżeli (Pierwszy symbol (C) = s2 ) C() W przeciwnym wypadku Błędne słowo } A sA() { Jeżeli (symbol = s) Czytaj kolejny symbol W przeciwnym wypadku Błędne słowo }
Problem C – Zagnieżdżone podzbiory Reguły realizacji parsera tej gramatyki – konstrukcja funkcji odpowiadających poszczególnym produkcjom Lista() L { E D { Jeżeli (symbol = { ) Czytaj kolejny symbol W przeciwnym razie Błędne słowo Element_listy() Rozwinięcie_listy() } Element_listy() E N | L { Jeżeli (symbol = { ) Lista() w przeciwnym razie jeżeli (Liczba naturalna) Przeczytaj tę liczbę w przeciwnym razie Błędne słowo }
Problem C – Zagnieżdżone podzbiory Rozwinięcie_listy() D , E D |} { Jeżeli (symbol = , ) Czytaj kolejny symbol Element_listy() Rozwinięcie_listy() w przeciwnym razie jeżeli (symbol = } ) Czytaj kolejny symbol w przeciwnym razie Błędne słowo } Analizuj_słowo() { Czytaj pierwszy symbol Lista() Jeżeli (przeczytane są wszystkie symbole) Poprawne słowo w przeciwnym razie Błędne słowo }
Problem A – Terytorium • Niech AMNbędzie tablicą, w której • Jeżeli działka na pozycji (i, j) jest wolna, to A[i, j] = maksymalna powierzchnia wolnego prostokąta o wysokości 1 i skrajnej prawej działce na pozycji (i, j). • Jeżeli działka na pozycji (i, j) jest zajęta, to A[i, j] = 0. • A = Mając tablicę A łatwo możemy wyznaczyć maksymalny wolny obszar prostokątny o narożniku na pozycji (i, j). Wszystko można robić równocześnie z wczytywaniem danych . Złożoność O(M2N). Jest możliwa optymalizacja ze względu na kolejność M i N.
Problem D – Cięcie kwadratu F(xF,N) D(0,N) C(N,N) E(N,yE) A(0,0) B(N,0) AE = [N; yE] ; EF = [xF – N; N – yE] AE EF N(xF – N) + yE(N – yE) = 0 skąd: xF = N – yE + yE2/N i zadanie już nie jest geometryczne. Szukamy odpowiedzi na pytanie: dla jakich całkowitych i(1 ≤ i ≤ N – 1) wyrażenie i2/Njest całkowite? Jeżeli N ma następujący rozkład na czynniki pierwsze: Odpowiedzią jest 8(r – 1) to i musi być postaci:
Problem E – Wielokąty kratowe Z twierdzenia Picka : W = P – B/2 +1 • Wystarczy obliczyć: • pole P wielokąta • liczbę B punktów kratowych na brzegu wielokąta Uwaga! Wartości iloczynów xiyi+1 lub xi+1yi mogą przekraczać zakres typu long.
Problem F – Jak dojechać? Szukamy takiego v aby: (av4+ bv3+ cv2+ dv) * (s / v) = m tzn. szukamy miejsca zerowego funkcji f(v) = s(av3+ bv2+ cv+ d) – m Można zastosować dowolną metodę, np. bisekcji; Newtona.
Problem G – Nieuczciwa gra Załóżmy, że A1 < A2 < A3 oraz B1 < B2 Tylko poniższe przypadki pozwalają zawsze wygrać: 1. A1 < A2 < A3 < B1 < B2 - trzecią kartą może być najniższa spośród pozostałych w talii 2. A1 < B1 < A2 < A3 < B2 - wybieramy najniższą większą od A3 (nie istnieje, gdy A3=51) 3. B1 < A1 < A2 < A3 < B2 - jw. 4. A1 < A2 < B1 < A3 < B2 - wybieramy najniższą większą od A2 (nie istnieje, gdy A2=49) 5. A1 < A2 < B1 < B2 < A3 - jw.
Problem H – Krecia robota Jeśli kopczyki są wierzchołkami grafu, a tunele je łączące – krawędziami, to taki graf jest drzewem. Wniosek: najkrótsza droga jest jedyną drogą łączącą dowolne dwa wierzchołki. Kopczyk poprzedzający nowoutworzony kopczyk możemy nazwać jego rodzicem. Zadanie sprowadza się do znalezienia wspólnego przodka wierzchołków S i T. Sposób numerowania wierzchołków (w grafie skierowanym odpowiada to posortowaniu topologicznemu) pozwala na prosty zapis algorytmu, którego główna część ma postać: if(A[S]<A[T]) {dist+=L[T]; T=A[T]; } else{dist+=L[S]; S=A[S]; } 7 2 8 1 9 Złożoność O(m) , gdzie m – liczba krawędzi. 0 3 3 2 4 5