Przeskocz do treści

Delta mi!

Informatyczny kącik olimpijski

Szukamy pola areału

Filip Wolski

o artykule ...

  • Publikacja w Delcie: sierpień 2008
  • Publikacja elektroniczna: 02-02-2011

Weźmy macierz math równą

display-math

i zdefiniujmy rekurencyjnie ciąg macierzy, z których każda następna powstaje zgodnie ze wzorem:

display-math

Zatem math jest wymiaru math mathmath i tak dalej. Kontynuując dostawianie macierzy, w ten sposób otrzymamy nieskończoną macierz, którą oznaczamy math

Zdefiniujmy areał jako spójny (w sensie sąsiedztwa wzdłuż boków, nie tylko w wierzchołkach), maksymalny (tj. niedający się powiększyć) zbiór pól macierzy o tych samych wartościach. W naszym zadaniu mamy dane współrzędne pola w macierzy math (wiersze i kolumny numerujemy od math). Należy obliczyć rozmiar areału zawierającego to pole (możliwe, że jest on nieskończony).

Głównym problemem w tym zadaniu jest wyobraźnia – najpierw należy wyobrazić sobie, jak właściwie wygląda macierz math potem trzeba wyobrażać sobie kształty i rozmiary areałów.

„Wycięty” z  math kwadrat o boku math (zawierający pole math) jest równy macierzy math Jeśli kwadrat będzie miał bok math to będzie równy math itd. Co więcej, wszystkie pola math oraz math mają w  math wartość math

Jak więc wyglądają areały? Na pewno jest jeden areał nieskończony, zawierający punkt math – choćby dlatego, że należą do niego wszystkie pola math oraz math Weźmy teraz areał, do którego należy punkt math Niech math dla pewnego math Wtedy pole math należy do math (ponieważ wymiar tej macierzy to math ). Ale kiedy tworzymy math to na wszystkich polach mathmath dla math ląduje wartość math W takim razie albo cały poszukiwany areał zawiera się w  math albo łączy z tym samym areałem, do którego należy math Jest więc tylko jeden areał nieskończony.

obrazek

Macierz math W obszarach obwiedzionych linią czarną znajdują się wartości math a kolorową math Zakreskowane areały są już zamknięte.

Macierz math W obszarach obwiedzionych linią czarną znajdują się wartości math a kolorową math Zakreskowane areały są już zamknięte.

Mamy już pewien zbiór spostrzeżeń, spróbujmy więc podejść do rozwiązania zadania. Definicja math jest rekurencyjna – skorzystajmy więc z tej samej techniki. Niech polem, którego areału poszukujemy, będzie pole math Na początek znajdźmy takie mathże math Nasze obliczenia możemy zamknąć w macierzy math ponieważ (zgodnie z poprzednimi stwierdzeniami) pole math będzie albo należeć do jedynego nieskończonego areału, albo jego areał będzie w całości zawarty w  math

Na początek sprawdźmy, do której ćwiartki macierzy math należy math i dla tej ćwiartki wywołajmy poszukiwania rekurencyjnie (tj. weźmy math math math).

Wyróżnijmy pewne rodzaje areałów, z którymi mamy do czynienia przy obsłudze podmacierzy kwadratowej w  math Niektóre z nich nie stykają się z krawędziami tej macierzy – takie areały są „zamknięte” i nie zostaną już powiększone. Pozostałe możemy podzielić na cztery klasy:

A
areał zawierający lewy górny róg
B
areał zawierający pole(a) na „dolnej” krawędzi macierzy
C
areał zawierający pole(a) na „prawej” krawędzi macierzy
D
areał spełniający B oraz C.

Wynikiem funkcji rekurencyjnej będzie wartość pola wraz z typem areału w podmacierzy, do którego to pole należy. I to już nam wystarczy, bo z tych danych możemy odtworzyć wartość pola i typ jego areału względem dwukrotnie większej macierzy. Na przykład, jeśli wywołanie rekurencyjne dla prawej-dolnej ćwiartki dało w wyniku wartość math areale typu A, to względem większej macierzy jest to pole o wartości math typu D. Podobnie trzeba obsłużyć inne przejścia.

W trzech przypadkach – gdy w lewej-górnej ćwiartce otrzymamy math dowolnego typu, w prawej-górnej ćwiartce otrzymamy math typu B, lub w lewej-dolnej ćwiartce otrzymamy math typu C – możemy zakończyć dalsze obliczenia. Wówczas otrzymujemy areał zamknięty, który zawiera się całkowicie w aktualnej macierzy.

Tym razem ćwiczeniem dla Czytelnika pozostanie stwierdzenie, z ilu pól właściwie ten zamknięty areał się składa...