#include <bits/stdc++.h>
using namespace std;
int n;
int a[55][55];
int dx[6] = {0, 1, 2, 0, -1, -2};
int dy[6] = {2, 1, 0, -2, -1, 0};
int get_ans(int daekods, int fdiasjisa, int asdkosa, int saofkasio) {
  printf("? %d %d %d %d\n", daekods, fdiasjisa, asdkosa, saofkasio);
  fflush(stdout);
  int x;
  scanf("%d", &x);
  return x ^ 1;
}
void get_all(int x, int y) {
  queue<pair<int, int> > que;
  que.push(pair<int, int>(x, y));
  while (que.size()) {
    pair<int, int> p = que.front();
    que.pop();
    for (int i = 0; i < 3; i++) {
      int nx = p.first + dx[i], ny = p.second + dy[i];
      if (nx >= 1 && nx <= n && ny >= 1 && ny <= n && a[nx][ny] == -1) {
        a[nx][ny] = get_ans(p.first, p.second, nx, ny) ^ a[p.first][p.second];
        que.push(pair<int, int>(nx, ny));
      }
    }
    for (int i = 3; i < 6; i++) {
      int nx = p.first + dx[i], ny = p.second + dy[i];
      if (nx >= 1 && nx <= n && ny >= 1 && ny <= n && a[nx][ny] == -1) {
        a[nx][ny] = get_ans(nx, ny, p.first, p.second) ^ a[p.first][p.second];
        que.push(pair<int, int>(nx, ny));
      }
    }
  }
}
void revert_all(int par) {
  if (!par) return;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) {
      if (!((i + j) & 1)) continue;
      a[i][j] ^= 1;
    }
}
void print_all() {
  puts("!");
  fflush(stdout);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      printf("%d", a[i][j]);
    }
    puts("");
    fflush(stdout);
  }
}
int main() {
  scanf("%d", &n);
  memset(a, -1, sizeof(a));
  a[1][1] = 1;
  a[n][n] = 0;
  get_all(1, 1);
  bool f = false;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) {
      if (f) break;
      if ((i + j) & 1) continue;
      if (j > 1 && i < n && a[i][j] != a[i + 1][j - 1]) {
        int same;
        if (j < n) {
          same = get_ans(i, j - 1, i + 1, j + 1);
          a[i][j - 1] = a[i + 1][j + 1] ^ same;
          get_all(i, j - 1);
        } else {
          same = get_ans(i, j - 1, i + 2, j);
          a[i][j - 1] = a[i + 2][j] ^ same;
          get_all(i, j - 1);
        }
        f = true;
      }
    }
  if (!f) {
    a[1][2] = 1;
    get_all(1, 2);
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++) {
        if (f) break;
        if (!((i + j) & 1)) continue;
        if (j > 1 && i < n && a[i][j] != a[i + 1][j - 1]) {
          int same;
          if (i == n - 1 && j == n) {
            same = get_ans(i, j - 2, i + 1, j);
            revert_all(a[i][j - 2] ^ a[i + 1][j] ^ same);
          } else if (j < n) {
            same = get_ans(i, j - 1, i + 1, j + 1);
            revert_all(a[i][j - 1] ^ a[i + 1][j + 1] ^ same);
          } else {
            same = get_ans(i, j - 1, i + 2, j);
            revert_all(a[i][j - 1] ^ a[i + 2][j] ^ same);
          }
          f = true;
        }
      }
  }
  if (!f) {
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++) {
        if (!((i + j) & 1)) continue;
        if (f) break;
        if (i + 1 <= n && j + 2 <= n && a[i][j] == a[i + 1][j + 2] &&
            a[i + 1][j] == a[i + 1][j + 1]) {
          int same = get_ans(i, j, i + 1, j + 2);
          revert_all(same);
          f = true;
          break;
        } else if (i + 1 <= n && j + 2 <= n && a[i][j] != a[i + 1][j + 2] &&
                   a[i + 1][j] != a[i + 1][j + 1]) {
          int same = get_ans(i, j, i + 1, j + 2);
          revert_all(!same);
          f = true;
          break;
        }
      }
  }
  assert(f);
  print_all();
  return 0;
}
