/*
* Problem :: 1347 / 미로 만들기
*
* Kind :: Simulation
*
* Insight
* - 홍준이는 미로 안의 한 칸에 남쪽을 보며 서있다
* => 어디에 서있는지는 모른다
* 홍준이는 미로에서 모든 행과 열의 이동할 수 있는 칸을 걸어다녔다
* => 이미 걸었던 칸을 다시 걸었을 수도 있다
* + 현재 칸의 (y,x) 를 (0,0) 으로 가정하자
* 그리고 문자열에서 주어지는 'F', 'L', 'R' 대로 착실히 움직이는데
* 이 방문한 칸의 좌표를 Set 에다 넣어주자
* # 직사각형의 미로에서 시작 칸인 (0,0) 기준
* 가장 왼쪽 아래 칸의 좌표 (lly, llx) 를 구하고
* 가장 오른쪽 위 칸의 좌표 (ury, urx) 를 구해서
* 직사각형의 가로와 세로의 길이를 구해주자
* -> 가로와 세로의 길이를 바탕으로 2차원 char 배열을 선언한 뒤
* Set 에 넣어진 좌표들 (y,x) 에 (lly, llx) 를 빼서
* 기준을 가장 왼쪽 아래 칸을 (0,0) 으로 맞춰주며 미로를 그려주자
*/
//
// BOJ
// ver.C++
//
// Created by GGlifer
//
// Open Source
#include <iostream>
#include <set>
#include <cstring>
using namespace std;
#define endl '\n'
// Set up : Global Variables
int dy[4] = {-1, 0, 0, +1};
int dx[4] = {0, -1, +1, 0};
enum { N, L, R, S };
enum { RL, RR };
int D[4][2] = { {L, R}, {S, N}, {N, S}, {R, L} };
// Set up : Functions Declaration
/* None */
int main()
{
// Set up : I/O
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Set up : Input
int L; cin >> L;
string C; cin >> C;
// Process
int cy = 0, cx = 0; /* 시작 칸의 좌표 */
int lly, ury, llx, urx; /* 가장 왼쪽 아래 칸의 좌표, 가장 오른쪽 위 칸의 좌표 */
lly = ury = cy;
llx = urx = cx;
set<pair<int,int>> M; /* 현재 칸 기준 방문한 칸의 좌표들이 저장된 Set */
M.insert({cy, cx}); /* 현재 칸을 Set 에 추가 */
int d = S; /* 초기 방향은 남쪽 */
for (char c : C) {
switch (c) {
case 'R': d = D[d][RR]; break; /* 방향을 오른쪽으로 전환 */
case 'L': d = D[d][RL]; break; /* 방향을 왼쪽으로 전환 */
case 'F':
cy += dy[d], cx += dx[d]; /* 현재 방향으로 한 칸 이동 */
M.insert({cy, cx}); /* 현재 칸을 Set 에 추가 */
lly = min(lly, cy), ury = max(ury, cy); /* lly, ury 갱신 */
llx = min(llx, cx), urx = max(urx, cx); /* llx, urx 갱신 */
break;
default: throw runtime_error("Invalid Command");
}
}
int r = ury-lly+1; /* 미로의 세로 길이 */
int c = urx-llx+1; /* 미로의 가로 길이 */
char A[r][c];
memset(A, '#', sizeof(A));
for (auto [y, x] : M) {
/* 시작 칸 좌표에서 가장 왼쪽 아래 칸 좌표로 기준을 옮김 */
A[y-lly][x-llx] = '.';
}
// Control : Output
for (int i=0; i<r; i++) {
for (int j=0; j<c; j++) {
cout << A[i][j];
} cout << endl;
}
}
// Helper Functions
/* None */