#include <bits/stdc++.h>
inline long long read() {
  long long f = 1, x = 0;
  char ch = getchar();
  while (!(ch >= '0' && ch <= '9')) {
    if (ch == '-') f *= -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return f * x;
}
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
int n, now, ans, x[4], y[4], map[50 + 1][50 + 1];
int check(int a, int b) {
  if (a >= 1 && a <= n && b >= 1 && b <= n)
    return true;
  else
    return false;
}
int main() {
  n = read();
  map[1][1] = 1, map[n][n] = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if ((i + j) % 2 == 0) {
        if ((i == 1 && j == 1) || (i == n && j == n)) continue;
        x[0] = i, y[0] = j;
        if (x[0] > 2)
          x[0] -= 2;
        else if (y[0] > 2)
          y[0] -= 2;
        else
          x[0] -= 1, y[0] -= 1;
        printf("? %d %d %d %d\n", x[0], y[0], i, j), fflush(stdout);
        map[i][j] = map[x[0]][y[0]] ^ read() ^ 1;
      }
    }
  }
  printf("? %d %d %d %d\n", 1, 2, 3, 2), fflush(stdout);
  map[1][2] = 0, map[3][2] = read() ^ 1;
  printf("? %d %d %d %d\n", 2, 1, 3, 2), fflush(stdout);
  map[2][1] = map[3][2] ^ read() ^ 1;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if ((i + j) % 2 == 1) {
        if ((i == 1 && j == 2) || (i == 3 && j == 2) || (i == 2 && j == 1))
          continue;
        x[0] = i, y[0] = j;
        if (x[0] > 2)
          x[0] -= 2;
        else if (y[0] > 2)
          y[0] -= 2;
        else
          x[0] -= 1, y[0] -= 1;
        printf("? %d %d %d %d\n", x[0], y[0], i, j), fflush(stdout);
        map[i][j] = map[x[0]][y[0]] ^ read() ^ 1;
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if ((i + j) % 2 == 1) {
        for (int p = 0; p <= 1; p++) {
          x[0] = i, y[0] = j, x[1] = i, y[1] = j;
          if (p == 0)
            x[0]--, x[1]++;
          else
            y[0]--, y[1]++;
          if (check(x[0], y[0]) == true && check(x[1], y[1]) == true) {
            now = map[x[0]][y[0]] ^ map[x[1]][y[1]];
            for (int k = 2; k <= 3; k++) {
              x[2] = x[0] + dx[k], y[2] = y[0] + dy[k];
              if (check(x[2], y[2]) == true) {
                if ((map[i][j] ^ map[x[2]][y[2]]) == now) {
                  printf("? %d %d %d %d\n", x[2], y[2], x[1], y[1]),
                      fflush(stdout);
                  ans = map[i][j] ^ map[x[0]][y[0]] ^ (read() ^ 1);
                  printf("!\n"), fflush(stdout);
                  for (int i = 1; i <= n; i++) {
                    for (int j = 1; j <= n; j++)
                      printf("%d", ((i + j) % 2 == 1 ? (map[i][j] ^ ans)
                                                     : map[i][j])),
                          fflush(stdout);
                    printf("\n"), fflush(stdout);
                  }
                  return 0;
                }
              }
            }
            for (int k = 0; k <= 1; k++) {
              x[2] = x[1] + dx[k], y[2] = y[1] + dy[k];
              if (check(x[2], y[2]) == true) {
                if ((map[i][j] ^ map[x[2]][y[2]]) == now) {
                  printf("? %d %d %d %d\n", x[0], y[0], x[2], y[2]),
                      fflush(stdout);
                  ans = map[i][j] ^ map[x[1]][y[1]] ^ (read() ^ 1);
                  printf("!\n"), fflush(stdout);
                  for (int i = 1; i <= n; i++) {
                    for (int j = 1; j <= n; j++)
                      printf("%d", ((i + j) % 2 == 1 ? (map[i][j] ^ ans)
                                                     : map[i][j])),
                          fflush(stdout);
                    printf("\n"), fflush(stdout);
                  }
                  return 0;
                }
              }
            }
          }
        }
      }
    }
  }
}
