#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
void qread(int &x) {
  int neg = 1;
  x = 0;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') neg = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') x = 10 * x + c - '0', c = getchar();
  x *= neg;
}
const int maxn = 505;
int n, tmp, rtmp, tx, ty;
char c[maxn];
int ans[maxn * 2];
int check[maxn][maxn];
bool vis[maxn][maxn];
int ask(int r1, int c1, int r2, int c2) {
  printf("? %d %d %d %d\n", r1, c1, r2, c2);
  fflush(stdout);
  scanf("%s", c);
  return c[0] == 'Y';
}
int find(int r, int c) {
  if (check[r][c] >= 0) return check[r][c];
  return check[r][c] = ask(1, 1, r, c);
}
void dfs(int x, int y) {
  if (vis[x][y]) return;
  vis[x][y] = true;
  if (x == tx && y == ty) {
    printf("! ");
    for (int(i) = 0; (i) < 2 * n - 2; i++) printf("%c", ans[i] ? 'D' : 'R');
    fflush(stdout);
    exit(0);
  }
  if (y - 1 >= ty) {
    int now = find(x, y - 1);
    if (now)
      ans[--rtmp] = 0, dfs(x, y - 1);
    else
      ans[--rtmp] = 1, dfs(x - 1, y);
  } else {
    ans[--rtmp] = 1;
    dfs(x - 1, y);
  }
}
int main() {
  scanf("%d", &n);
  rtmp = 2 * n - 2;
  int x = 1, y = 1;
  while (n - (x + 1) + n - y >= n - 1) {
    if (ask(x + 1, y, n, n))
      x++, ans[tmp] = 1;
    else
      y++, ans[tmp] = 0;
    tmp++;
  }
  tx = x;
  ty = y;
  memset(check, -1, sizeof(check));
  dfs(n, n);
  return 0;
}
