#include <bits/stdc++.h>
using namespace std;
const int N = 64;
int n, a[N][N], b, ex[N][N];
vector<pair<int, int>> moves = {{0, 2}, {1, 1}, {2, 0}};
vector<vector<pair<int, int>>> paths = {
    {{0, 1}, {0, 1}, {0, 1}}, {{0, 1}, {0, 1}, {1, 0}},
    {{0, 1}, {1, 0}, {0, 1}}, {{0, 1}, {1, 0}, {1, 0}},
    {{1, 0}, {0, 1}, {0, 1}}, {{1, 0}, {0, 1}, {1, 0}},
    {{1, 0}, {1, 0}, {0, 1}}, {{1, 0}, {1, 0}, {1, 0}},
};
bool in(int i) { return 0 <= i && i < n; }
bool can(int i, int j, int x, int y) {
  if (!(in(i) && in(j) && in(x) && in(y))) return 0;
  return (a[i][j] == -1) != (a[x][y] == -1);
}
void ask(int i, int j, int x, int y, bool upd) {
  int ix = i + 1, jx = j + 1, xx = x + 1, yx = y + 1;
  bool check = 1 <= ix && ix <= xx && xx <= n && 1 <= jx && jx <= yx &&
               yx <= n && ix + jx + 1 <= xx + yx;
  if (!check)
    cout << "bad: " << ix << " " << jx << " " << xx << " " << yx << endl;
  if (0) {
    b = (ex[i][j] == ex[x][y]);
  } else {
    cout << "? " << i + 1 << " " << j + 1 << " " << x + 1 << " " << y + 1
         << endl;
    cin >> b;
  }
  if (upd) {
    if (a[i][j] == -1)
      a[i][j] = a[x][y] ^ (!b);
    else
      a[x][y] = a[i][j] ^ (!b);
  }
}
vector<pair<int, int>> get(int i, int j, vector<pair<int, int>> p) {
  vector<pair<int, int>> res = {{i, j}};
  for (auto it : p) {
    res.push_back({res.back().first + it.first, res.back().second + it.second});
  }
  for (auto it : res)
    if (!in(it.first) || !in(it.second)) return {};
  return res;
}
bool fix() {
  for (int i = 0, ggd = n; i < ggd; i++)
    for (int j = 0, ggd = n; j < ggd; j++)
      for (auto p : paths) {
        vector<pair<int, int>> v = get(i, j, p);
        if (!((int)(v).size())) continue;
        int c = 0;
        for (auto it : v) c += a[it.first][it.second];
        if (!(c & 1)) {
          ask(v[0].first, v[0].second, v[3].first, v[3].second, 0);
          return (a[v[0].first][v[0].second] == a[v[3].first][v[3].second]) !=
                 b;
        }
      }
  cout << "Bad matrix: " << endl;
  for (int i = 0, ggd = n; i < ggd; i++) {
    for (int j = 0, ggd = n; j < ggd; j++) cout << a[i][j] << " ";
    cout << endl;
  }
  exit(0);
}
void solve(int _n) {
  n = _n;
  memset(a, -1, sizeof(a));
  a[0][0] = 1;
  a[n - 1][n - 1] = 0;
  a[0][1] = 1;
  for (int i = 0, ggd = n; i < ggd; i++)
    for (int j = 0, ggd = n; j < ggd; j++) {
      for (auto it : moves) {
        int x = i + it.first, y = j + it.second;
        if (can(i, j, x, y)) ask(i, j, x, y, 1);
      }
    }
  if (fix()) {
    for (int i = 0, ggd = n; i < ggd; i++)
      for (int j = 0, ggd = n; j < ggd; j++)
        if ((i + j) & 1) a[i][j] = !a[i][j];
  }
}
bool check() {
  for (int i = 0, ggd = n; i < ggd; i++)
    for (int j = 0, ggd = n; j < ggd; j++)
      if (a[i][j] != ex[i][j]) return 0;
  return 1;
}
void brute(int n) {
  for (int mask = 0, ggd = 1 << (n * n); mask < ggd; mask++) {
    for (int i = 0, ggd = n; i < ggd; i++)
      for (int j = 0, ggd = n; j < ggd; j++) {
        bool wtf = mask & (1 << (n * i + j));
        ex[i][j] = wtf;
      }
    if (ex[0][0] != 1 || ex[n - 1][n - 1] != 0) continue;
    solve(n);
    if (!check()) {
      cout << "Failed. Expected " << endl;
      for (int i = 0, ggd = n; i < ggd; i++) {
        for (int j = 0, ggd = n; j < ggd; j++) cout << ex[i][j] << " ";
        cout << endl;
      }
      cout << "But obtained" << endl;
      for (int i = 0, ggd = n; i < ggd; i++) {
        for (int j = 0, ggd = n; j < ggd; j++) cout << a[i][j] << " ";
        cout << endl;
      }
      exit(0);
    }
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n;
  solve(n);
  cout << "!" << endl;
  for (int i = 0, ggd = n; i < ggd; i++) {
    for (int j = 0, ggd = n; j < ggd; j++) cout << a[i][j];
    cout << endl;
  }
}
