#include <bits/stdc++.h>
using namespace std;
const long double EPS = 1e-18;
const double DEPS = 1e-9;
const long double PI = 3.141592653589793238;
const long long MOD = 998244353;
const int N = (int)(5e5) + 1;
void inp() {}
void out() {}
long long gcd(long long fx, long long fy) {
  if (!fy) return fx;
  return gcd(fy, fx % fy);
}
inline void fill(int* ar, int sz, int val) {
  for (int i = 0; i < sz; i++) {
    ar[i] = val;
  }
}
int n;
bool ans[51][51], pl, change;
bool ask(int x1, int y1, int x2, int y2) {
  cout << "? " << x1 << ' ' << y1 << ' ' << x2 << ' ' << y2 << endl;
  cin >> pl;
  return pl;
}
int main() {
  inp();
  cin >> n;
  memset(ans, 0, sizeof(ans));
  ans[1][1] = 1;
  ans[n][n] = 0;
  for (int i = 1; i <= n; i++) {
    if (i != 1)
      ans[i][1] = ans[i][3] ^ ask(i, 1, i, 3) ^ 1;
    else
      ans[i][3] = ans[i][1] ^ ask(i, 1, i, 3) ^ 1;
    if (i != n) {
      ans[i + 1][2] = ans[i][1] ^ ask(i, 1, i + 1, 2) ^ 1;
      if (i + 1 != n || n != 3)
        ans[i + 1][3] = ans[i][2] ^ ask(i, 2, i + 1, 3) ^ 1;
    }
    for (int j = 2; j + 2 <= n; j++) {
      if (i == n && j + 2 == n) continue;
      ans[i][j + 2] = ans[i][j] ^ ask(i, j, i, j + 2) ^ 1;
    }
  }
  for (int i = 1; i + 2 <= n; i += 2) {
    if (ans[i][i] == 1 && ans[i + 2][i + 2] == 0) {
      if (ask(i, i, i + 1, i + 2)) {
        change = 1 ^ ans[i + 1][i + 2];
      } else if (ask(i, i + 1, i + 2, i + 2)) {
        change = ans[i][i + 1];
      } else if (ans[i][i + 1] == ans[i + 1][i + 2]) {
        change = ans[i][i + 1] ^ ans[i][i + 2] ^ 1;
      } else {
        change = rand() % 2;
      }
      break;
    }
  }
  cout << "!" << endl;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if ((i + j) & 1) ans[i][j] ^= change;
      printf("%d", ans[i][j]);
    }
    puts("");
  }
}
