#include <bits/stdc++.h>
using namespace std;
template <class A, class B>
ostream& operator<<(ostream& os, pair<A, B> p) {
  return os << "(" << p.first << ", " << p.second << ")";
}
template <class A>
ostream& operator<<(ostream& os, vector<A> v) {
  os << "{ ";
  for (auto x : v) cout << x << " ";
  return os << "}";
}
template <class A>
ostream& operator<<(ostream& os, vector<vector<A>> v) {
  os << "{" << v.front() << '\n';
  for (auto it = next(v.begin()); it != v.end(); it++) os << " " << *it << '\n';
  return os << "}";
}
using VI = vector<int>;
using VVI = vector<VI>;
using II = pair<int, int>;
using L = long long;
using VL = vector<L>;
using VVL = vector<VL>;
using VB = vector<bool>;
using VVB = vector<VB>;
int main() {
  int n;
  cin >> n;
  bool response;
  VVB out(n, VB(n, 0));
  auto Ask = [&](int a, int b, int c, int d) {
    cout << "? " << a + 1 << " " << b + 1 << " " << c + 1 << " " << d + 1
         << "\n"
         << flush;
    cin >> response;
    out[c][d] = out[a][b] ^ response ^ 1;
  };
  out[0][0] = 1;
  for (int sum_cor = 2; sum_cor <= 2 * (n - 2); sum_cor += 2)
    for (int x = max(0, sum_cor - (n - 1)); x <= min(sum_cor, n - 1); x++) {
      int y = sum_cor - x;
      int x1, y1;
      if (!x)
        x1 = x, y1 = y - 2;
      else if (!y)
        y1 = y, x1 = x - 2;
      else
        x1 = x - 1, y1 = y - 1;
      Ask(x1, y1, x, y);
    }
  out[0][1] = 0;
  for (int x = 0; x <= n - 1; x += 2) {
    if (x > 0) Ask(x - 2, 1, x, 1);
    for (int y = 3; y < n; y += 2) Ask(x, y - 2, x, y);
  }
  out[1][0] = 0;
  for (int x = 1; x < n; x += 2) {
    if (x > 1) Ask(x - 2, 0, x, 0);
    for (int y = 2; y < n; y += 2) Ask(x, y - 2, x, y);
  }
  cout << "? 1 2 2 3\n" << flush;
  cin >> response;
  response = response ^ bool(out[0][1] == out[1][2]);
  if (response)
    for (int i = 1; i < n; i += 2)
      for (int j = 0; j < n; j += 2) out[i][j] = out[i][j] ^ 1;
  ;
  auto Pair = [&](int x) {
    if (x <= n - 1)
      return II{0, x};
    else
      return II{x - n + 1, n - 1};
  };
  bool przegranko = 0;
  for (decltype((2 * n - 4) - 1) l = (0), l__ = ((2 * n - 4) - 1); l <= l__;
       l++) {
    II a = Pair(l);
    II b = Pair(l + 1);
    II c = Pair(l + 2);
    II d = Pair(l + 3);
    if (out[a.first][a.second] ^ out[b.first][b.second] ^
        out[c.first][c.second] ^ out[d.first][d.second] == 0) {
      cout << "? " << a.first + 1 << " " << a.second + 1 << " " << d.first + 1
           << " " << d.second + 1 << "\n"
           << flush;
      cin >> response;
      przegranko =
          bool(out[a.first][a.second] == out[d.first][d.second]) ^ response;
      break;
    }
  }
  if (przegranko)
    for (decltype((n)-1) i = (0), i__ = ((n)-1); i <= i__; i++)
      for (decltype((n)-1) j = (0), j__ = ((n)-1); j <= j__; j++)
        if ((i + j) & 1) out[i][j] = out[i][j] ^ 1;
  cout << "!\n" << flush;
  for (decltype((n)-1) i = (0), i__ = ((n)-1); i <= i__; i++) {
    for (decltype((n)-1) j = (0), j__ = ((n)-1); j <= j__; j++)
      cout << out[i][j] << flush;
    cout << "\n" << flush;
  }
  return 0;
}
