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

2020-2022 2023 Regulations Schedule RODO info Ranking

Problem description


Snake
(snake)
Memory limit: 256 MB
Time limit: 8.00 s

Jasio znalazł na ulicy bardzo stary telefon – Nokię 3310. Skontaktował się z właścicielemi i umówił się, żeby ją jutro oddać. Jasio niestety nie powstrzymał się i sprawdził, że w telefonie zainstalowana jest gra Snake. Wariant gry zainstalowany na komórce jest odrobinę inny niż zwykle i Jasio nie potrafi go wygrać.

Plansza do gry składa się z pól następujących rodzajów:

  • zwykłe (.) – można po nich chodzić,
  • zabronione (#) – wejście w nie powoduje przegraną,
  • z jabłkiem (J) – wejście w nie powoduje wydłużenie węża o jeden segment.

Wąż składa się z k ≥ 1 segmentów ponumerowanych kolejnymi liczbami naturalnymi. Głowa węża znajduje się w miejscu segmentu numer 1. Przy poruszaniu się, głowa węża przemieszcza się najpierw, natychmiast potem jednocześnie każdy segment zajmuje miejsce segmentu o numerze o jeden mniejszym. Jasio steruje głową: w każdym ruchu może nacisnąć jedną ze strzałek: prawo, lewo, góra lub dół i głowa węża przemieści się wtedy w tym kierunku. Początkowo wąż składa się tylko z głowy, zakładamy, że pod nią jest zwykłe pole (.).

Ruchy węża ograniczone są następującymi warunkami:

  • wąż nie może wyjść głową poza planszę,
  • wąż nie może przechodzić przez pola zabronione (#),
  • wąż może zjadać jabłka (J), zjedzone jabłko znika i zamienia się w zwykłe pole (.), a wąż wydłuża się o jeden segment (k + 1-szy segment pojawia się w polu, w którym wcześniej, przed ruchem, był k-ty segment),
  • głowa skręca o 0, 90 lub  − 90 w stosunku do poprzedniego ruchu, pierwszy ruch można wykonać w dowolnym kierunku,
  • dwa segmenty węża nie mogą być jednocześnie na jednym polu (dozwolone jest jednak, że głowa przemieści się na pole, na którym wcześniej był ostatni segment węża).

Aby wygrać, Jasio musi zjeść wężem wszystkie jabłka. Chciałby dokonać tego w jak najmniejszej liczbie ruchów. Ile ich potrzeba?

Napisz program, który wczyta sytuację na planszy do gry w Snake, wyznaczy optymalne rozwiązanie i wypisze wynik na standardowe wyjście.

Wejście

W pierwszym (jedynym) wierszu wejścia znajdują się dwie liczby naturalne N oraz M, oddzielone pojedynczym odstępem i określające kolejno liczbę wierszy i kolumn na planszy. W każdym z kolejnych N wierszy znajduje się ciąg M znaków J, G, . lub # (zakładamy, że G oznacza głowę węża, na planszy jest dokładnie jeden taki symbol).

Wyjście

W pierwszym (jedynym) wierszu wyjścia powinna się znaleźć jedna liczba całkowita – minimalna liczba ruchów potrzebna do zwycięstwa.

Jeżeli osiągnięcie celu jest niemożliwe, zamiast tego należy wypisać jedno słowo NIE.

Ograniczenia

1 ≤ N, M ≤ 15.

Na planszy znajduje się co najwyżej 8 jabłek.

Przykład

Input Output
5 4
...J
J.#.
.G#.
J#..
##..
20