#include <bits/stdc++.h>
using namespace std;
template <typename T = int>
T input() {
  T res;
  cin >> res;
  return res;
}
template <typename It>
void input_seq(It begin, It end, istream &in = cin) {
  generate(begin, end,
           input<typename remove_reference<decltype(*begin)>::type>);
}
template <class It>
void output(It begin, It end, ostream &out = cerr) {
  while (begin != end) {
    out << *(begin++) << ' ';
  }
  out << endl;
}
const int MX[3] = {0, 1, 2};
const int MY[3] = {2, 1, 0};
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  int n = input();
  vector<vector<bool>> fld(n, vector<bool>(n));
  vector<vector<bool>> rev(n, vector<bool>(n));
  fld[0][0] = rev[0][0] = true;
  fld[n - 1][n - 1] = rev[n - 1][n - 1] = false;
  fld[0][1] = false;
  rev[0][1] = true;
  auto ask = [&](int x1, int y1, int x2, int y2) {
    cout << "? " << x1 + 1 << ' ' << y1 + 1 << ' ' << x2 + 1 << ' ' << y2 + 1
         << endl;
    cout.flush();
    int b;
    cin >> b;
    if (b == -1) {
      exit(0);
    }
    return bool(b);
  };
  for (int j = 0; j < n - 2; ++j) {
    bool b = !ask(0, j, 0, j + 2);
    fld[0][j + 2] = fld[0][j] ^ b;
    rev[0][j + 2] = rev[0][j] ^ b;
  }
  for (int i = 0; i < n - 1; ++i) {
    for (int j = 0; j < n - 1; ++j) {
      bool b = !ask(i, j, i + 1, j + 1);
      fld[i + 1][j + 1] = fld[i][j] ^ b;
      rev[i + 1][j + 1] = rev[i][j] ^ b;
    }
    bool b = !ask(i + 1, 0, i + 1, 2);
    fld[i + 1][0] = fld[i + 1][2] ^ b;
    rev[i + 1][0] = rev[i + 1][2] ^ b;
  }
  auto print = [&]() {
    for (int k = 0; k < n; ++k) {
      output(fld[k].begin(), fld[k].end());
    }
    cerr << endl;
    for (int k = 0; k < n; ++k) {
      output(rev[k].begin(), rev[k].end());
    }
  };
  auto cell = [&](int val) {
    assert(0 <= val && val < 2 * n - 1);
    if (val < n) {
      return make_pair(val, 0);
    } else {
      return make_pair(n - 1, val - n + 1);
    }
  };
  for (int i = 0; i < 2 * n - 4; ++i) {
    bool b = false;
    for (int j = 0; j < 4; ++j) {
      auto [x, y] = cell(i + j);
      b ^= fld[x][y];
    }
    if (!b) {
      auto [sx, sy] = cell(i);
      auto [ex, ey] = cell(i + 3);
      bool bb = (ask(sx, sy, ex, ey) == (fld[sx][sy] == fld[ex][ey]));
      cout << "!" << endl;
      if (bb) {
        for (int k = 0; k < n; ++k) {
          for (int l = 0; l < n; ++l) {
            cout << fld[k][l];
          }
          cout << endl;
        }
      } else {
        for (int k = 0; k < n; ++k) {
          for (int l = 0; l < n; ++l) {
            cout << rev[k][l];
          }
          cout << endl;
        }
      }
      return 0;
    }
  }
  assert(0);
}
