#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e18;
const long long N = 50 + 5;
const long long M = 50 * 50 + 5;
long long query(long long x1, long long y1, long long x2, long long y2) {
  x1++, y1++, x2++, y2++;
  cout << "? " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
  cin >> x1;
  return x1;
}
bool valid(long long i, long long j, long long I, long long J) {
  if (I < i or J < j) return false;
  return (i + j + 2 <= I + J);
}
long long n, a[2][N][N];
long long dp[2][M][M];
long long Node(long long i, long long j) { return (n * i + j + 1); }
void solve(long long i, long long j, long long I, long long J, long long m) {
  long long cur = Node(i, j), des = Node(I, J);
  if (cur == des) {
    dp[m][cur][des] = 1;
    return;
  }
  if (a[m][i][j] != a[m][I][J]) return;
  if (i == I) {
    if (J - j == 1) {
      dp[m][cur][des] = 1;
    } else {
      dp[m][cur][des] = dp[m][cur + 1][des - 1];
    }
    return;
  }
  if (j == J) {
    if (I - i == 1) {
      dp[m][cur][des] = 1;
    } else {
      dp[m][cur][des] = dp[m][cur + n][des - n];
    }
    return;
  }
  dp[m][cur][des] = 0;
  pair<long long, long long> p[4];
  p[0] = {cur + 1, des - n};
  p[1] = {cur + 1, des - 1};
  p[2] = {cur + n, des - n};
  p[3] = {cur + n, des - 1};
  for (auto &it : p) {
    if (it.first >= 0 and it.first < N and it.second >= 0 and it.second < N) {
      dp[m][cur][des] |= dp[m][it.first][it.second];
    }
  }
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  a[0][0][0] = 1;
  a[0][n - 1][n - 1] = 0;
  for (long long i = 2; i < n; i += 2) {
    long long f = query(i - 2, 0, i, 0);
    a[0][i][0] = a[0][i - 2][0];
    if (!f) a[0][i][0] ^= 1;
  }
  for (long long i = 1; i < n; i += 2) {
    long long f = query(i - 1, 0, i, 1);
    a[0][i][1] = a[0][i - 1][0];
    if (!f) a[0][i][1] ^= 1;
  }
  for (long long i = 0; i < n; i++) {
    long long k = (i & 1 ? 3 : 2);
    for (long long j = k; j < n; j += 2) {
      if (i == n - 1 and j == n - 1) continue;
      long long f = query(i, j - 2, i, j);
      a[0][i][j] = a[0][i][j - 2];
      if (!f) a[0][i][j] ^= 1;
    }
  }
  a[0][0][1] = 1;
  long long f = query(0, 1, 1, 2);
  a[0][1][2] = a[0][0][1];
  if (!f) a[0][1][2] ^= 1;
  for (long long j = 3; j < n; j += 2) {
    long long f = query(0, j - 2, 0, j);
    a[0][0][j] = a[0][0][j - 2];
    if (!f) a[0][0][j] ^= 1;
    f = query(0, j, 1, j + 1);
    a[0][1][j + 1] = a[0][0][j];
    if (!f) a[0][1][j + 1] ^= 1;
  }
  f = query(1, 0, 1, 2);
  a[0][1][0] = a[0][1][2];
  if (!f) a[0][1][0] ^= 1;
  for (long long j = 0; j < n; j++) {
    long long k = (j & 1 ? 2 : 3);
    for (long long i = k; i < n; i += 2) {
      long long f = query(i - 2, j, i, j);
      a[0][i][j] = a[0][i - 2][j];
      if (!f) a[0][i][j] ^= 1;
    }
  }
  for (long long i = 0; i < n; i++) {
    for (long long j = 0; j < n; j++) {
      if ((i + j) % 2 == 0) {
        a[1][i][j] = a[0][i][j];
      } else {
        a[1][i][j] = a[0][i][j] ^ 1;
      }
    }
  }
  for (long long i = n - 1; i >= 0; i--)
    for (long long j = n - 1; j >= 0; j--) {
      for (long long I = i; I < n; I++)
        for (long long J = j; J < n; J++) {
          solve(i, j, I, J, 0);
          solve(i, j, I, J, 1);
        }
    }
  long long flag = 0;
  for (long long i = 0; i < n; i++)
    for (long long j = 0; j < n; j++)
      for (long long I = i; I < n; I++)
        for (long long J = j; J < n; J++) {
          long long cur = Node(i, j), des = Node(I, J);
          if (dp[0][cur][des] != dp[1][cur][des]) {
            if (!valid(i, j, I, j)) continue;
            long long f = query(i, j, I, J);
            if (dp[0][cur][des] == f) {
              flag = 0;
            } else {
              flag = 1;
            }
            goto lab;
          }
        }
lab:;
  cout << "!" << endl;
  for (long long i = 0; i < n; i++) {
    for (long long j = 0; j < n; j++) {
      cout << a[flag][i][j];
    }
    cout << endl;
  }
  return 0;
}
