W tablicy wypełnionej liczbami całkowitymi należy znaleźć największy kwadrat w którym wszystkie elementy są równe pewnemu wybranemu. Rozwiązaniem jest algorytm o złożoności kwadratowej.
Poniżej została przedstawiona przykładowa tablica. Poszukiwany jest kwadrat w którym wszystkie elementy będą miały wartość x = 1.
1 | 1 | 4 | 1 |
2 | 1 | 1 | 1 |
1 | 1 | 1 | 1 |
---|---|---|---|
1 | 1 | 1 | 7 |
1 | 1 | 1 | 1 |
Dla podanego przykładu prawidłową odpowiedzią jest lewa, dolna podtablica 3×3. Jeśli jednak szukać podtablicy dla x = 7 to odpowiedzią jest 1×1, a dla wartości 3 nie ma odpowiedzi, ponieważ element ten nie występuje.
W celu wyznaczenia podtablicy dla pewnych zadanych wartości należy utworzyć tablicę o tej samej wielkości, a następnie wypełnić pierwszy wiersz oraz kolumnę według zasady, że jeśli na pozycji (i, j) stoi element x to należy wstawić 1, a w przeciwnym razie 0. Pozostałe elementy należy wypełnić przechodzą od lewej do prawej w kolejnych wierszach. Tym razem należy wybrać minimum spośród wartości powyżej pozycji (i, j) na lewo i na lewo do góry i dodać jeden jeśli element to x, a w przeciwnym razie postawić 0.
Dla podanej wcześniej tablicy zgodnie z przedstawionym algorytmem otrzymalibyśmy:
1 | 1 | 0 | 1 |
0 | 1 | 1 | 1 |
1 | 1 | 2 | 1 |
1 | 2 | 2 | 0 |
1 | 2 | 3 | 1 |
Na koniec w tablicy wystarczy wyszukać element o największej wartości - będzie to rozmiar maksymalnej, kwadratowej tablicy o wszystkich elementach x. Tutaj zgodnie z wcześniejszą odpowiedzią podtablica ma rozmiar 3×3.
Poniższa funkcja szukajPodtablicy() wyszukuje podtablicy w tablicy tab złożonej z elementów x. W wyniku zwracana jest liczba całkowita - szerokość maksymalnej, kwadratowej podtablicy.
Na początku wykonana zostaje kopia tablicy, a następnie wypełnione zostają wszystkie elementy prócz pierwszego wiersza oraz pierwszej kolumny. W trakcie przypisywania nowej wartości dla pola na którym znajdowała się wartość x sprawdzane jest czy nie ma nowej wartości maksymalnej. Dzięki temu nie będzie trzeba przeglądać tablicy jeszcze raz. Na koniec zostaje zwrócona maksymalna znaleziona wartość.
Poniższy fragment kodu służy do wczytania danych od użytkownika, a następnie wypisania odpowiedzi.