#include <bits/stdc++.h>
const int oo = 0x7fffffff;
const long long OO = 0x7fffffffffffffff;
using namespace std;
const int NX = 50;
typedef bitset<NX * NX * NX * NX> dp_t;
int n;
array<bitset<NX>, NX> board1, board2, done;
dp_t dp1, dp2;
int ask(int x1, int y1, int x2, int y2) {
  cout << "? " << (1 + x1) << " " << (1 + y1) << " " << (1 + x2) << " "
       << (1 + y2) << endl;
  int r;
  cin >> r;
  if (r == -1) exit(0);
  return r;
}
void ask_n_set(int x1, int y1, int x2, int y2, bool forward = true) {
  int r = ask(x1, y1, x2, y2) ^ 1;
  if (forward) {
    board1[x2][y2] = r ^ board1[x1][y1];
    board2[x2][y2] = r ^ board2[x1][y1];
    done[x2][y2] = 1;
  } else {
    board1[x1][y1] = r ^ board1[x2][y2];
    board2[x1][y1] = r ^ board2[x2][y2];
    done[x1][y1] = 1;
  }
}
void print(const array<bitset<NX>, NX>& B) {
  cout << "!\n";
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n; ++j) cout << B[i][j];
    cout << "\n";
  }
  cout << endl;
}
void solve(const array<bitset<NX>, NX>& B, dp_t& dp) {
  for (int x1 = 0; x1 < n; ++x1)
    for (int y1 = 0; y1 < n; ++y1)
      for (int x2 = 0; x2 < n; ++x2)
        for (int y2 = 0; y2 < n; ++y2)
          if ((abs(x1 - x2) + abs(y1 - y2)) <= 2)
            dp[(y2 + NX * (x2 + NX * (y1 + NX * x1)))] = B[x1][y1] == B[x2][y2];
  for (int x1 = 0; x1 < n; ++x1)
    for (int y1 = 0; y1 < n; ++y1)
      for (int x2 = x1 - 1; x2 >= 0; --x2)
        for (int y2 = y1 - 1; y2 >= 0; --y2)
          dp[(y2 + NX * (x2 + NX * (y1 + NX * x1)))] = 0;
  for (int len = 3; len < (2 * n); ++len)
    for (int x1 = 0; x1 < n; ++x1)
      for (int y1 = 0; y1 < n; ++y1)
        for (int x2 = x1; x2 < n; ++x2)
          if ((abs(x1 - x2) + abs(y1 - y1)) <= len) {
            int d = len - (x2 - x1);
            int y2 = y1 + d;
            if (y2 >= n) continue;
            if (x1 == x2) {
              dp[(y2 + NX * (x2 + NX * (y1 + NX * x1)))] =
                  B[x1][y1] == B[x2][y2] and
                  dp[(y2 - 1 + NX * (x2 + NX * (y1 + 1 + NX * x1)))];
            } else if (y1 == y2) {
              dp[(y2 + NX * (x2 + NX * (y1 + NX * x1)))] =
                  B[x1][y1] == B[x2][y2] and
                  dp[(y2 + NX * (x2 - 1 + NX * (y1 + NX * x1 + 1)))];
            } else {
              dp[(y2 + NX * (x2 + NX * (y1 + NX * x1)))] =
                  B[x1][y1] == B[x2][y2] and
                  (dp[(y2 + NX * (x2 - 1 + NX * (y1 + NX * x1 + 1)))] or
                   dp[(y2 - 1 + NX * (x2 + NX * (y1 + NX * x1 + 1)))] or
                   dp[(y2 + NX * (x2 - 1 + NX * (y1 + 1 + NX * x1)))] or
                   dp[(y2 - 1 + NX * (x2 + NX * (y1 + 1 + NX * x1)))]);
            }
          }
}
int main() {
  cin >> n;
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < n; ++j) done[i][j] = 0;
  board2[0][0] = board1[0][0] = 1;
  board2[n - 1][n - 1] = board1[n - 1][n - 1] = 0;
  done[0][0] = done[n - 1][n - 1] = 1;
  board1[0][1] = 1;
  board2[0][1] = 0;
  done[0][1] = 1;
  ask_n_set(0, 1, 2, 1);
  ask_n_set(1, 0, 2, 1, false);
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < n; ++j)
      if (not done[i][j]) {
        int x, y;
        if (i - 2 >= 0) {
          x = i - 2;
          y = j;
        } else if (j - 2 >= 0) {
          x = i;
          y = j - 2;
        } else {
          x = i - 1;
          y = j - 1;
        }
        ask_n_set(x, y, i, j);
      }
  solve(board1, dp1);
  solve(board2, dp2);
  for (int x1 = 0; x1 < n; ++x1)
    for (int x2 = x1; x2 < n; ++x2)
      for (int y1 = 0; y1 < n; ++y1)
        for (int y2 = y1; y2 < n; ++y2)
          if (2 <= y2 - y1 + x2 - x1) {
            int r1 = dp1[(y2 + NX * (x2 + NX * (y1 + NX * x1)))],
                r2 = dp2[(y2 + NX * (x2 + NX * (y1 + NX * x1)))];
            if (r1 == r2) continue;
            int r = ask(x1, y1, x2, y2);
            if (r1 == r)
              print(board1);
            else
              print(board2);
            return 0;
          }
  print(board1);
  return 0;
}
