#include <bits/stdc++.h>
using namespace std;
const int OO = 1e9;
const double EPS = 1e-9;
template <class T>
void _db(const char* dbStr, T e) {
  cout << dbStr << " = " << e << endl;
}
template <class T, class... L>
void _db(const char* dbStr, T e, L... r) {
  while (*dbStr != ',') cout << *dbStr++;
  cout << " = " << e << ',';
  _db(dbStr + 1, r...);
}
template <class S, class T>
ostream& operator<<(ostream& o, const map<S, T>& v) {
  o << "[";
  int i = 0;
  for (const pair<S, T>& pr : v)
    o << (!i++ ? "" : ", ") << "{" << pr.first << " : " << pr.second << "}";
  return o << "]";
}
template <template <class, class...> class S, class T, class... L>
ostream& operator<<(ostream& o, const S<T, L...>& v) {
  o << "[";
  int i = 0;
  for (const auto& e : v) o << (!i++ ? "" : ", ") << e;
  return o << "]";
}
template <class S, class T>
ostream& operator<<(ostream& o, const pair<S, T>& pr) {
  return o << "(" << pr.first << ", " << pr.second << ")";
}
ostream& operator<<(ostream& o, const string& s) {
  for (const char& c : s) o << c;
  return o;
}
template <class T>
using V = vector<T>;
template <class T>
using VV = V<V<T>>;
template <class T>
using VVV = VV<V<T>>;
using ll = long long;
using pii = pair<int, int>;
using vi = V<int>;
using vii = V<pii>;
using vvi = VV<int>;
using mii = map<int, int>;
using umii = unordered_map<int, int>;
using si = set<int>;
using usi = unordered_set<int>;
int main() {
  ios::sync_with_stdio(false);
  cout.precision(10);
  cin.tie(0);
  int n;
  cin >> n;
  vvi a(n + 1, vi(n + 1));
  int q = 0;
  auto ask = [&](int x, int y, int xx, int yy) {
    ++q;
    if (make_pair(x, y) > make_pair(xx, yy)) swap(x, xx), swap(y, yy);
    cout << "? " << x << ' ' << y << ' ' << xx << ' ' << yy << endl;
    int ret;
    cin >> ret;
    return ret;
  };
  a[1][1] = 1;
  for (int i = 3; i <= n; i += 2) {
    a[1][i] = a[1][i - 2] ^ (!ask(1, i - 2, 1, i));
    a[i][1] = a[i - 2][1] ^ (!ask(i - 2, 1, i, 1));
  }
  for (int i = 2; i <= n; ++i) {
    for (int j = 2; j <= n; ++j) {
      if (i == n && j == n) break;
      if ((i + j) % 2 == 0)
        a[i][j] = a[i - 1][j - 1] ^ (!ask(i - 1, j - 1, i, j));
    }
  }
  a[2][3] = a[1][2] ^ (!ask(1, 2, 2, 3));
  a[2][1] = a[2][3] ^ (!ask(2, 1, 2, 3));
  for (int i = 4; i <= n; i += 2) {
    a[1][i] = a[1][i - 2] ^ (!ask(1, i - 2, 1, i));
    a[i][1] = a[i - 2][1] ^ (!ask(i - 2, 1, i, 1));
  }
  for (int i = 2; i <= n; ++i) {
    for (int j = 2; j <= n; ++j) {
      if (i == n && j == n) break;
      if ((i + j) % 2 == 1 && make_pair(i, j) != make_pair(2, 3))
        a[i][j] = a[i - 1][j - 1] ^ (!ask(i - 1, j - 1, i, j));
    }
  }
  assert(q == n * n - 3);
  for (int i = 1; i <= n - 2; ++i) {
    for (int j = 1; j <= n - 2; ++j) {
      if ((i + j) % 2 == 0 && a[i][j] && !a[i + 2][j + 2]) {
        int c = a[i + 1][j + 1];
        int q1 = ask(i, j, i + 1, j + 2), q2 = ask(i + 1, j, i + 2, j + 2);
        bool flip = 0;
        if (a[i][j + 2] != a[i + 1][j + 1] || a[i][j + 1] != a[i + 1][j]) {
          int valOfB = q1;
          flip = (valOfB != a[i + 1][j + 2]);
        } else if (a[i + 1][j + 1] != a[i + 2][j] ||
                   a[i + 1][j + 2] != a[i + 2][j + 1]) {
          int valOfA = !q2;
          flip = (valOfA != a[i + 1][j]);
        } else {
          if (q1 == 1) {
            int valOfA = c;
            flip = (valOfA != a[i][j + 1]);
          } else if (q2 == 1) {
            int valOfA = 0;
            flip = (valOfA != a[i][j + 1]);
          } else {
            if (!c) {
              int valOfA = 1;
              flip = (valOfA != a[i][j + 1]);
            } else {
              int valOfB = 0;
              flip = (valOfB != a[i + 1][j + 2]);
            }
          }
        }
        cout << "!" << endl;
        for (int i = 1; i <= n; ++i) {
          for (int j = 1; j <= n; ++j) {
            if (flip && (i + j) % 2 == 1) a[i][j] = !a[i][j];
            cout << a[i][j];
          }
          cout << '\n';
        }
        return 0;
      }
    }
  }
  return 0;
}
