#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  long long Hashimoto = 0;
  bool Kanna = 1;
  char I_Love = getchar();
  while (I_Love < '0' || I_Love > '9') {
    if (I_Love == '-') Kanna = 0;
    I_Love = getchar();
  }
  while (I_Love >= '0' && I_Love <= '9') {
    Hashimoto = Hashimoto * 10 + I_Love - '0';
    I_Love = getchar();
  }
  return (Kanna ? Hashimoto : -Hashimoto);
}
template <typename T1, typename T2>
inline void Umax(T1 &a, T2 b) {
  if (a < b) a = b;
}
template <typename T1, typename T2>
inline void Umin(T1 &a, T2 b) {
  if (a > b) a = b;
}
bool ask(int a, int b, int c, int d) {
  cout << "? " << a << " " << b << " " << c << " " << d << endl;
  cout.flush();
  int x;
  cin >> x;
  return x;
}
int n;
int ans[55][55];
int tmp[4][4];
int path[4][4] = {{1, 1, 2, 3}, {1, 1, 3, 2}, {2, 1, 3, 3}, {1, 2, 3, 3}};
int ok(int a, int b, int c, int d, string s = "") {
  if (a > c || b > d) return 0;
  s.push_back(tmp[a][b] + 'a');
  if (a == c && b == d) {
    string rs = s;
    reverse(rs.begin(), rs.end());
    ;
    return rs == s;
  }
  return ok(a + 1, b, c, d, s) | ok(a, b + 1, c, d, s);
}
int shit() {
  int x = 0;
  for (int i = 0; i < (4); ++i) {
    x += ok(path[i][0], path[i][1], path[i][2], path[i][3]) << i;
  }
  return x;
}
void dodo() {
  for (int p = 0; p < (n - 2); ++p)
    for (int q = 0; q < (n - 2); ++q) {
      for (int i = 1; i < (4); ++i)
        for (int j = 1; j < (4); ++j) tmp[i][j] = ans[i + p][j + q];
      int m1 = shit();
      for (int i = 1; i < (4); ++i)
        for (int j = 1; j < (4); ++j)
          if ((i + j) % 2) tmp[i][j] = 1 - tmp[i][j];
      int m2 = shit();
      for (int i = 0; i < (4); ++i)
        if (((m1 & (1 << i)) != (m2 & (1 << i)))) {
          if (ask(path[i][0] + p, path[i][1] + q, path[i][2] + p,
                  path[i][3] + q) == ((m2 >> i) & 1)) {
            for (int x = 1; x < (n + 1); ++x)
              for (int y = 1; y < (n + 1); ++y)
                if ((x + y) % 2) {
                  ans[x][y] = 1 - ans[x][y];
                }
          }
          return;
        }
    }
  assert(0);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  ;
  memset(ans, -1, sizeof(ans));
  cin >> n;
  ans[1][1] = 1;
  ans[n][n] = 0;
  for (int i = 1; i < n; i += 2) {
    if (ask(i, 1, i + 2, 1))
      ans[i + 2][1] = ans[i][1];
    else
      ans[i + 2][1] = 1 - ans[i][1];
    if (ask(i, 1, i + 1, 2))
      ans[i + 1][2] = ans[i][1];
    else
      ans[i + 1][2] = 1 - ans[i][1];
  }
  for (int i = 1; i <= n; i += 2) {
    for (int j = 1; j + 2 <= n; j += 2) {
      if (i == n && j == n - 2) continue;
      if (ask(i, j, i, j + 2))
        ans[i][j + 2] = ans[i][j];
      else
        ans[i][j + 2] = 1 - ans[i][j];
    }
  }
  n = n;
  for (int i = 2; i < n; i += 2) {
    for (int j = 2; j + 2 <= n; j += 2) {
      if (ask(i, j, i, j + 2))
        ans[i][j + 2] = ans[i][j];
      else
        ans[i][j + 2] = 1 - ans[i][j];
    }
  }
  ans[1][2] = 1;
  for (int i = 1; i < (n + 1); ++i) {
    int pos = -1;
    for (int j = 1; j < (n + 1); ++j)
      if ((i + j) % 2 && ans[i][j] != -1) {
        pos = j;
        break;
      }
    assert(pos != -1);
    for (int j = pos - 2; j >= 1; j -= 2) {
      if (ask(i, j, i, j + 2))
        ans[i][j] = ans[i][j + 2];
      else
        ans[i][j] = 1 - ans[i][j + 2];
    }
    for (int j = pos; j + 2 <= n; j += 2) {
      if (ask(i, j, i, j + 2))
        ans[i][j + 2] = ans[i][j];
      else
        ans[i][j + 2] = 1 - ans[i][j];
    }
    if (i == n) break;
    int j = (i % 2 ? 2 : 1);
    if (ask(i, j, i + 1, j + 1))
      ans[i + 1][j + 1] = ans[i][j];
    else
      ans[i + 1][j + 1] = 1 - ans[i][j];
  }
  dodo();
  cout << "!\n";
  for (int i = 1; i < (n + 1); ++i) {
    for (int j = 1; j < (n + 1); ++j) cout << ans[i][j];
    cout << endl;
  }
  return 0;
}
