#!/usr/bin/python3 from enum import Enum from queue import Queue # seznam všech možných směrů, kterými se můžeme po náměstí klouzat # první číslo určuje o kolik se změní při jednom kroku řádek, druhé určuje změnu čísla sloupce class Dir(Enum): LEFT = (0, -1) RIGHT = (0, 1) UP = (-1, 0) DOWN = (1, 0) def slide(row, col, H, W, square_map, direction): # posouváme se v zedaném směru do té doby, dokud nenarazíme do stěny while 0 <= row < H and 0 <= col < W: # nacházíme se na políčku se sochou if square_map[row][col] == "#": # musíme se vrátit o jedno políčko zpět před sochu row -= direction[0] col -= direction[1] break # dojeli jsme do cíle if square_map[row][col] == "C": break # posuneme se o jedno políčko dál v zadaném směru row += direction[0] col += direction[1] return row, col def find_start(H, W, square_map): # prohledáváme celé náměstí, dokud nenarazíme na startovní políčko for i in range(H): for j in range(W): if square_map[i][j] == "S": return i, j def find_path(H, W, square_map): backtrack_map = [[(-1, -1) for _ in range(W)] for _ in range(H)] start = find_start(H, W, square_map) # předcházející políčko startovnímu políčku v backtrackovací tabulce nastavíme na samotné startovní políčko pro zjednodušení implementace backtrack_map[start[0]][start[1]] = start # zde používáme frontu pro prohledávání do šířky # můžeme použít ale i zásobník, nějakou cestu stále najdeme queue = Queue() queue.put(start) while queue: row, col = queue.get() # zkusíme všechny možné směry pohybu for direction in Dir: # najdeme políčko, na kterém bychom se zastavili end_row, end_col = slide(row, col, H, W, square_map, direction.value) # pokud jsme na tomto políčku ještě nebyli, zaznačíme si pro něj informace do backtrackovací tabulky a vydáme se do něj if backtrack_map[end_row][end_col] == (-1, -1): backtrack_map[end_row][end_col] = (row, col) queue.put((end_row, end_col)) # pokud jsme narazili na cílové políčko, vypíšeme cestu a skončíme if square_map[end_row][end_col] == "C": print_path(end_row, end_col, backtrack_map) return def print_path(row, col, backtrack_map): path = "" # v backtrackovací tabulce jsme jako předchozí políčko pro startovní políčko nastavili to samé startovní políčko # jakmile tak najdeme při zpětném průchodu takovéto políčko, došli jsme odzadu zpět na start while backtrack_map[row][col] != (row, col): prev_row, prev_col = backtrack_map[row][col] if prev_row == row: # pohybovali jsme se po stejném řádku if prev_col < col: # číslo sloupce se při pohybu zvětšovalo, šli jsme doprava path += "P" else: path += "L" else: # pohybovali jsme se ve stejném sloupci if prev_row < row: # číslo řádku se při pohybu zvětšovalo, šli jsme dolů path += "D" else: path += "N" row = prev_row col = prev_col # jelikož jsme cestu procházeli odzadu, musíme ji nakonec otočit print("".join(reversed(path))) def main(): H, W = map(int, input().split()) square_map = [] for _ in range(H): row = list(input()) square_map.append(row) find_path(H, W, square_map) if __name__ == "__main__": main()