II Olimpiada Informatyczna 1994/95

Zadanie: POC
Autor: Andrzej Walat
Pochylnia

Zawody III stopnia  
Plik źródłowy: POC.??? (np. pas, c, cpp)
Plik wykonywalny: POC.exe
Plik wejściowy: POC.in
Plik wyjściowy: POC.out

 

Na pochylni na nabrzeżu portowym są ułożone w przypadkowej kolejności beczki w trzech kolorach: czerwone, zielone i niebieskie. Trzeba je uporządkować, za pomocą dźwigu w taki sposób, aby na początku (najniżej) były czerwone, następnie niebieskie, a na końcu (najwyżej) zielone.

Dźwig - w jednym ruchu - może podnieść do góry jednocześnie trzy sąsiednie beczki w dowolnym miejscu na pochylni i przenieść je na koniec, za beczki leżące powyżej, które stoczą się pod własnym ciężarem w dół wypełniając lukę.

Trzeba ułożyć plan pracy dźwigu dyktujący w kolejnych ruchach, którą trójkę beczek przenieść na koniec.

Ułożenie beczek na pochylni zapisujemy za pomocą ciągu l liter c, n, z, gdzie l to liczba beczek. Litery c, n, z w tym ciągu symbolizują odpowiednio beczkę czerwoną, niebieską lub zieloną. Zakładamy, że liczba beczek l jest nie większa niż 2000 oraz, że na pochylni są przynajmniej 3 beczki zielone.

Plan porządkowania beczek za pomocą dźwigu można zapisać w postaci skończonego ciągu R = (r1,...,rk) liczb całkowitych dodatnich nie większych niż l- 2. Kolejny i-ty wyraz ciągu R - ri to pozycja (licząc od dołu) najniższej z trzech beczek, jakie należy przenieść na koniec w i-tym ruchu.

Przykład

9 beczek ułożonych na pochylni w kolejności: (czerwona, zielona, niebieska, niebieska, czerwona, niebieska, zielona, zielona, niebieska) zapisujemy za pomocą ciągu: (c, z, n, n, c, n, z, z, n).

Dźwig pracujący według planu R = (6, 2, 5) będzie zmieniał ich ułożenie w następujący sposób: (c, z, n, n, c, n, n, z, z), (c, c, n, n, z, z, z, n, n), (c, c, n, n, n, n, z, z, z) i po trzech ruchach uporządkuje je w kolejności czerwone- niebieskie-zielone.

Zadanie

Napisz program, który:

Dla każdego ułożenia początkowego beczek (jeśli są przynajmniej trzy beczki zielone) istnieje wiele planów ich porządkowania w kolejności czerwone- niebieskie-zielone. Mogą się one różnić liczbą ruchów. Twój program powinien znaleźć i wypisać tylko jeden z nich. Liczba ruchów nie musi być minimalna, aby rozwiązanie było poprawne. Powinieneś jednak dążyć do tego by Twój program układał plany porządkowania beczek w możliwie małej liczbie ruchów i aby znajdował je możliwie jak najszybciej.

Wejście

Wyjście

Przykład

Dla pliku POC.IN:
9
c
z
n
n
c
n
z
z
n

poprawnym rozwiązaniem jest następujący ciąg w pliku POC.OUT:
6
2
5

Twój program powinien szukać pliku POC.IN w katalogu bieżącym i tworzyć plik POC.OUT również w bieżącym katalogu. Plik zawierający napisany przez Ciebie program w postaci źródłowej powinien mieć nazwę POC.???, gdzie zamiast ??? należy wpisać co najwyżej trzyliterowy skrót nazwy użytego języka programowania. Ten sam program w postaci wykonywalnej powinien być zapisany w pliku POC.EXE.