#include <bits/stdc++.h>
using namespace std;
bool query(int x1, int y1, int x2, int y2) {
  cout << "? " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
  int ans;
  cin >> ans;
  return ans;
}
bool check(vector<vector<vector<vector<char>>>> &da,
           vector<vector<vector<vector<char>>>> &db) {
  int n = da.size() - 2;
  for (int i1 = 1; i1 <= n; ++i1)
    for (int j1 = 1; j1 <= n; ++j1)
      for (int i2 = i1 + 1; i2 <= n; ++i2)
        for (int j2 = j1 + 1; j2 <= n; ++j2)
          if (da[i1][j1][i2][j2] != db[i1][j1][i2][j2])
            return query(i1, j1, i2, j2) == da[i1][j1][i2][j2];
}
int main() {
  int n;
  cin >> n;
  vector<vector<char>> a(n + 2, vector<char>(n + 2, 2));
  a[1][1] = 1;
  for (int i = 3; i <= n; i += 2)
    a[i][1] = (query(i - 2, 1, i, 1) ? a[i - 2][1] : !a[i - 2][1]);
  for (int i = 2; i < n; i += 2)
    a[i][2] = (query(i - 1, 1, i, 2) ? a[i - 1][1] : !a[i - 1][1]);
  for (int i = 1; i <= n; ++i)
    for (int j = 3 + !(i & 1); j <= n; j += 2)
      a[i][j] = (query(i, j - 2, i, j) ? a[i][j - 2] : !a[i][j - 2]);
  a[1][2] = 0;
  for (int i = 3; i <= n; i += 2)
    a[i][2] = (query(i - 2, 2, i, 2) ? a[i - 2][2] : !a[i - 2][2]);
  for (int i = 2; i < n; i += 2)
    a[i][1] = (query(i, 1, i + 1, 2) ? a[i + 1][2] : !a[i + 1][2]);
  for (int i = 1; i <= n; ++i)
    for (int j = 3 + (i & 1); j <= n; j += 2)
      a[i][j] = (query(i, j - 2, i, j) ? a[i][j - 2] : !a[i][j - 2]);
  vector<vector<char>> b = a;
  for (int i = 1; i <= n; ++i)
    for (int j = 1 + (i & 1); j <= n; j += 2) b[i][j] = !a[i][j];
  vector<vector<vector<vector<char>>>> da(
      n + 2, vector<vector<vector<char>>>(
                 n + 2, vector<vector<char>>(n + 2, vector<char>(n + 2))));
  vector<vector<vector<vector<char>>>> db(
      n + 2, vector<vector<vector<char>>>(
                 n + 2, vector<vector<char>>(n + 2, vector<char>(n + 2))));
  for (int md = 0; md < 2 * n; ++md) {
    for (int dx = 0; dx <= md; ++dx) {
      for (int i1 = 1; i1 <= n - dx; ++i1) {
        for (int j1 = 1; j1 <= n - (md - dx); ++j1) {
          int i2 = i1 + dx;
          int j2 = j1 + md - dx;
          da[i1][j1][i2][j2] =
              (a[i1][j1] == a[i2][j2] &&
               (md < 3 || da[i1 + 1][j1][i2 - 1][j2] ||
                da[i1 + 1][j1][i2][j2 - 1] || da[i1][j1 + 1][i2 - 1][j2] ||
                da[i1][j1 + 1][i2][j2 - 1]));
          db[i1][j1][i2][j2] =
              (b[i1][j1] == b[i2][j2] &&
               (md < 3 || db[i1 + 1][j1][i2 - 1][j2] ||
                db[i1 + 1][j1][i2][j2 - 1] || db[i1][j1 + 1][i2 - 1][j2] ||
                db[i1][j1 + 1][i2][j2 - 1]));
        }
      }
    }
  }
  if (!check(da, db)) a.swap(b);
  cout << "!\n";
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) cout << (int)a[i][j];
    cout << "\n";
  }
  cout << endl;
  return 0;
}
