Problem hidden
|This problem was hidden by Editorial Board member probably because it has incorrect language|version or invalid test data, or description of the problem is not clear.|

AL_30_08 - Ecape cube

Cube - trailer

Bierzesz udział w zabawie znanej jako "Escape room". Tylko że tym razem musisz wydostać się z labiryntu pomieszczeń, tworzących sześcian.

Grę rozpoczynasz w pomieszczeniu, którego położenia w sześcianie nie znasz. Nie wiesz też jaki jest rozmiar sześcianu, który może wynosić od 2 (8 pokoi) do 27 (19683 pokoje). Z każdego pomieszczenia można przejść do jednego z co najwyżej sześciu sąsiednich (pokoje na skraju sześcianu mają mniej niż sześciu sąsiadów). Sześć kierunków, w których można się poruszać oznaczmy literami: E (East), W (West), N (North), S (South), U (Up), D (Down). Oczywiście pary kierunków przeciwnych to E-W, N-S i U-D.

W niektórych pokojach umieszczone są pułapki i wejście do takiego pomieszczenia kończy się przegraną. Aby wygrać, należy przedostać się do pokoju o współrzędnych (0,0,0) (czyli takiego, że ruch w kierunku W lub S lub D oznaczałby wyjście poza sześcian) i wykonać ruch w kierunku 'W' lub 'S'. Wyjście poza sześcian w innym miejscu oznacza przegraną.

Żeby bezpieczne wydostanie się z sześcianu było możliwe, przy każdym z sześciu wyjść z danego pokoju zapisana jest liczba całkowita (oznaczmy ją X), która daje informacje na temat tego, co znajduje się po drugiej stronie przejścia. Wartość -1 oznacza, że ruch w tym kierunku spowodowałby wyjście z sześcianu. Nieujemna wartość X informuje, że po drugiej stronie przejścia jest pokój. Wiadomo też jaką cechę mają liczby oznaczające przejście do pokoju z pułapką (co jest chyba najcenniejszą dla Ciebie informacją).

Jeśli reszta z dzielenia X przez pewną małą liczbę pierwszą P wynosi R, to w sąsiednim pokoju jest pułapka. 
Jeśli reszta z dzielenia X przez P jest różna od R, to sąsiedni pokój nie zawiera pułapki. 

Niestety nie znasz ani liczby P ani R. Wiesz za to jakie są dopuszczalne wartości liczby P, oraz że pułapki nie zawiera pokój startowy, żaden z pokojów sąsiadujących z pokojem startowym oraz pokój, do którego należy się przedostać, czyli o współrzędnych (0,0,0).

Napisz program, który na podstawie wartości liczb X, wygeneruje sekwencję ruchów, prowadzących do wydostania się z sześcianu. Zagwarantowane jest, że da się to zrobić dokonując logicznego wnioskowania.

2
17 -1 34 -1 19 -1
-1 2 51 -1 100 -1
-2
-1 7 -1 11 18 -1
-2
-1 10 20 -1 -1 21
35 -1 -1 25 -1 4
-1 12 -1 36 -1 14

Wejście/Wyjście

UWAGA! W zadaniu użyty jest specjalny sędzia, który wymaga odpowiedniej interakcji Twojego programu.

Jedyna wartość, jaką na początku należy odczytać z wejścia, to liczba k (1k7) oznaczająca ile najmniejszych liczb pierwszych należy brać pod uwagę jako możliwą wartość liczby P. Np. dla k=7, P może mieć jedną z wartości: 2, 3, 5, 7, 11, 13, 17.

Następnie Twój program powinien podawać na wyjście jedno z 13 dopuszczalnych poleceń: ?A, ?E, ?W, ?N, ?S, ?U, ?D, E, W, N, S, U, D.

Po wydaniu polecenia ?A, sędzia poda na wejście, sześć liczb całkowitych oznaczających wartości X (0X109) znajdujące się przy przejściach w kolejnych kierunkach (obowiązuje kolejność: E W N S U D).

Po wydaniu jednego z sześciu pozostałych poleceń ze znakiem "?", sędzia poda na wejście jedną liczbę całkowitą, oznaczającą wartość X przy przejściu w wybranym kierunku (oznaczonym literą po ?).

Wydanie polecenia złożonego z pojedynczej litery, oznacza przejście w wybranym kierunku. W tym wypadku sędzia sprawdza, czy wykonując taki ruch wyszedłeś właśnie z pokoju (0,0,0) w kierunku 'S' lub 'W', co daje wynik "accepted" (pod warunkiem, że Twój program zakończy w tej sytuacji działanie) czy może znalazłeś się w pokoju z pułapką lub poza sześcianem (co skutkuje zakończeniem programu z wynikiem "wrong answer"). Jeśli nie zaszła żadna z wymienionych sytuacji, sędzia czeka na Twoje kolejne polecenie.

Przykład

Wejście: 2
Wyjście: ?A
Wejście: -1 12 -1 36 -1 14 
Wyjście: D
Wyjście: ?A
Wejście: -1 7 -1 11 18 -1 
Wyjście: U
Wyjście: S
Wyjście: ?A
Wejście: -1 10 20 -1 -1 21 
Wyjście: N
Wyjście: W
Wyjście: ?A
Wejście: 35 -1 -1 25 -1 4 
Wyjście: E
Wyjście: D
Wyjście: S
Wyjście: ?W
Wejście: 2
Wyjście: W
Wyjście: S

Pomoc do przykładu: 
Z pierwszej linii wejścia wynika, że pod uwagę należy brać jedynie reszty z dzielenia przez 2 i przez 3.
Z przebiegu gry można wywnioskować, że odbywała się ona w sześcianie o wymiarze 2, a pokoje z pułapkami oznaczone były liczbami, które z dzielenia przez 3 dają resztę 1.
Polecenie ?W wydane pod koniec gry jest właściwie zbędne, ponieważ wtedy w kierunku zachodnim znajduje się pokój końcowy, a ten z pewnością nie zawiera pułapki. 

UWAGA: Program po wypisaniu każdej linii powinien opróżniać bufor wyjściowy. Np. w C++ można to zrobić poleceniem fflush(stdout), a przy wykorzystaniu strumienia cout wystarczy wypisywaną linię zakończyć używając endl.

 


Dodane przez:Witold Długosz
Data dodania:2016-10-24
Limit czasu wykonania programu:1s
Limit długości kodu źródłowego50000B
Limit pamięci:1536MB
Cluster: Cube (Intel G860)
Języki programowania:All except: ASM64 GOSU
Pochodzenie: ALGOLIGA 30
© Spoj.com. All Rights Reserved. Spoj uses Sphere Engine™ © by Sphere Research Labs.