Mistrzostwa Polski Szkół Średnich w Programowaniu Zespołowym 2024

2020-2022 2023 Regulations Schedule RODO info Ranking

Problem description


Klotski
(klotski)
Limit pamięci: 512 MB
Limit czasu: 10.00 s

Jasio w starym Ubuntu odnalazł bardzo ciekawą i chyba trudną grę: Klotski (w pakiecie gnome-klotski). Gra polega na tym, aby na małej planszy bardzo zapełnionej klockami wyprowadzić główny klocek poza planszę. Niestety nie jest to łatwe, bo miejsca jest mało:

image

Przykładowa plansza w grze Klotski. W tym przypadku klocek główny to duży kwadrat 2 × 2, zaś pola docelowe oznaczone są na zielono.

W żadnym momencie gry, klocki nie mogą na siebie nachodzić. Klocków nie można obracać, ani rozrywać, a jedynie wolno je przesuwać w dół, górę, prawo lub lewo i tylko i wyłącznie na wolne pola. Klocki nie muszą być prostokątami, ale zawsze stanowią spójną część.

Celem gry jest położyć klocek główny tak, aby zakrywał on wszystkie pola docelowe. Jedynie klocek główny może znaleźć się na polach docelowych, dla pozostałych klocków te pola są niedostępne. Oczywiście cel gry należy osiągnąć w jak najmniejszej liczbie ruchów. Za ruch uznaje się tutaj przesunięcie jednego wybranego klocka o jedną jednostkę.

Napisz program, który: wczyta konfigurację początkową gry Klotski, wyznaczy minimalną liczbę ruchów niezbędnych do przejścia gry i wypisze wynik na standardowe wyjście.

Wejście

W pierwszym wierszu wejścia znajdują się dwie liczby naturalne N oraz M, oddzielone pojedynczym odstępem i określające kolejno: wysokość i szerokość planszy. W kolejnych N wierszach znajduje się po M znaków – opis planszy. Klocki, których nie można przesunąć oznaczone są znakami #. Klocek główny oznaczony jest znakami @. Pola docelowe oznaczone są znakami !. Pole wolne, na którym nie stoi żaden klocek oznaczone jest znakiem .. Pozostałe klocki oznaczane są wielkimi literami alfabetu angielskiego. Te same litery przyporządkowane są tym samym klockom, zaś różne litery – różnym klockom.

Gwarantowane jest, że testy zawierają tylko zagadki możliwe do rozwiązania.

Wyjście

W pierwszym (i jedynym) wierszu wyjścia należy wypisać jedną liczbę naturalną – minimalną liczbę ruchów niezbędnych do zakrycia wszystkich pól docelowych klockiem głównym.

Ograniczenia

3 ≤ N, M ≤ 6, N ⋅ M ≤ 25.

Przykład

Wejście Wyjście
3 3
@A!
BAC
#D.
4
Wejście Wyjście Wyjaśnienie
6 4
A@@B
A@@B
CDDE
FGHI
J..K
#!!#
57

To jest chyba całkiem trudny poziom tej gry.