#include <bits/stdc++.h>
using namespace std;
int n;
int a[55][55];
bool flag;
int w[][2] = {3, 0, 2, 1, 1, 2, 0, 3};
vector<int> v;
int q(int a, int b, int c, int d) {
  cout << "? " << a + 1 << " " << b + 1 << " " << c + 1 << " " << d + 1 << "\n";
  fflush(stdout);
  int x;
  cin >> x;
  return !x;
}
bool pl() {
  bool ok = 1;
  for (int i = 0; i < 4; i++) ok &= (v[i] == v[3 - i]);
  return ok;
}
void dfs(int a, int b, int c, int d) {
  if (a > c || b > d) return;
  v.push_back(::a[a][b]);
  if (a == c && b == d) {
    flag |= pl();
    v.pop_back();
    return;
  }
  dfs(a + 1, b, c, d);
  dfs(a, b + 1, c, d);
  v.pop_back();
}
bool chk(int a, int b, int c, int d) {
  flag = 0;
  dfs(a, b, c, d);
  return flag;
}
pair<pair<int, int>, pair<int, int> > fnd() {
  pair<pair<int, int>, pair<int, int> > res = {{-1, -1}, {-1, -1}};
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      for (int ww = 0; ww < 4; ww++) {
        pair<int, int> go = {i + w[ww][0], j + w[ww][1]};
        if (go.first >= n || go.second >= n) continue;
        if (chk(i, j, go.first, go.second)) {
          return {{i, j}, go};
        }
      }
    }
  }
  return res;
}
void revert(int val) {
  for (int i = 0; i < n; i++) {
    for (int j = n - 1; j >= 0; j--) {
      if ((i + j) % 2 == 0) continue;
      a[i][j] ^= val;
    }
  }
}
int main() {
  cin >> n;
  a[0][0] = 1;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if (i == 0 && j == 0) continue;
      if ((i + j) % 2) continue;
      if (i == 0) {
        a[i][j] = a[i][j - 2] ^ q(i, j - 2, i, j);
      } else if (j == 0) {
        a[i][j] = a[i - 2][j] ^ q(i - 2, j, i, j);
      } else {
        a[i][j] = a[i - 1][j - 1] ^ q(i - 1, j - 1, i, j);
      }
    }
  }
  a[0][n - 2] = 0;
  for (int i = 0; i < n; i++) {
    for (int j = n - 1; j >= 0; j--) {
      if (i == 0 && j == n - 2) continue;
      if ((i + j) % 2 == 0) continue;
      if (j == 0 || i == 0) {
        a[i][j] = a[i][j + 2] ^ q(i, j, i, j + 2);
      } else {
        a[i][j] = a[i - 1][j - 1] ^ q(i - 1, j - 1, i, j);
      }
    }
  }
  pair<pair<int, int>, pair<int, int> > stb = fnd();
  if (stb.first.first == -1) {
    revert(1);
    stb = fnd();
    assert(stb.first.first != -1);
  }
  revert(q(stb.first.first, stb.first.second, stb.second.first,
           stb.second.second));
  cout << "!\n";
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      cout << a[i][j];
    }
    cout << "\n";
  }
  fflush(stdout);
}
