#include <bits/stdc++.h>
using namespace std;
const int N = 55;
const int inf = 1000 * 1000 * 1000;
const int mod = 998244353;
int n;
int res[N][N];
int dx[] = {2, 1, 0};
int dy[] = {0, 1, 2};
int query(int x1, int u1, int x2, int u2) {
  printf("? %d %d %d %d\n", x1, u1, x2, u2);
  cout.flush();
  int x;
  cin >> x;
  return x;
}
vector<pair<int, int> > P;
bool find_path(int x1, int u1, int x2, int u2) {
  P.push_back(make_pair(x1, u1));
  if (x1 == x2 && u1 == u2) {
    int z = 0;
    for (int i = 0; i < 2; i++) {
      if (res[P[i].first][P[i].second] ==
          res[P[3 - i].first][P[3 - i].second]) {
        ++z;
      } else {
        --z;
      }
    }
    if (z == 2 || z == -2) return true;
    P.pop_back();
    return false;
  }
  if (x1 + 1 <= x2) {
    if (find_path(x1 + 1, u1, x2, u2)) return true;
  }
  if (u1 + 1 <= u2) {
    if (find_path(x1, u1 + 1, x2, u2)) return true;
  }
  P.pop_back();
  return false;
}
bool check(int x1, int u1, int x2, int u2) {
  int L = x2 - x1 + u2 - u1;
  if (L != 3) return false;
  return find_path(x1, u1, x2, u2);
}
int main() {
  mt19937 myrand(chrono::steady_clock::now().time_since_epoch().count());
  cin >> n;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      res[i][j] = -1;
    }
  }
  res[1][1] = 1;
  if (query(1, 1, 2, 2))
    res[2][2] = res[1][1];
  else
    res[2][2] = (res[1][1] ^ 1);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if ((i + j) % 2 == 0) {
        if (res[i][j] == -1) {
          if (j > 2) {
            if (query(i, j - 2, i, j))
              res[i][j] = res[i][j - 2];
            else
              res[i][j] = (res[i][j - 2] ^ 1);
          } else {
            if (query(i - 2, j, i, j))
              res[i][j] = res[i - 2][j];
            else
              res[i][j] = (res[i - 2][j] ^ 1);
          }
        }
      }
    }
  }
  res[1][2] = 1;
  if (query(1, 2, 3, 2))
    res[3][2] = 1;
  else
    res[3][2] = 0;
  if (query(2, 1, 3, 2))
    res[2][1] = res[3][2];
  else
    res[2][1] = (res[3][2] ^ 1);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if ((i + j) % 2) {
        if (res[i][j] == -1) {
          if (j > 2) {
            if (query(i, j - 2, i, j))
              res[i][j] = res[i][j - 2];
            else
              res[i][j] = (res[i][j - 2] ^ 1);
          } else {
            if (query(i - 2, j, i, j))
              res[i][j] = res[i - 2][j];
            else
              res[i][j] = (res[i - 2][j] ^ 1);
          }
        }
      }
    }
  }
  bool T = false;
  int x1, u1, x2, u2;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      for (int ii = i; ii <= n; ii++) {
        for (int jj = j; jj <= n; jj++) {
          if ((ii + jj) % 2 != (i + j) % 2) {
            if (check(i, j, ii, jj)) {
              T = true;
              x1 = i;
              x2 = ii;
              u1 = j;
              u2 = jj;
              break;
            }
          }
        }
        if (T) break;
      }
      if (T) break;
    }
    if (T) break;
  }
  assert(T);
  int answ = query(x1, u1, x2, u2);
  if (answ == 0 && res[x1][u1] == res[x2][u2] ||
      answ == 1 && res[x1][u1] != res[x2][u2]) {
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) {
        if ((i + j) % 2) {
          res[i][j] ^= 1;
        }
      }
    }
  }
  printf("!\n");
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      printf("%d", res[i][j]);
    }
    printf("\n");
  }
  cout.flush();
  return 0;
}
