#include <bits/stdc++.h>
using namespace std;
struct vec {
  long double x, y;
  bool operator==(const vec &a) const { return x == a.x && y == a.y; }
  bool operator<(const vec &a) const {
    if (a.x != x) return x < a.x;
    return y < a.y;
  }
  vec operator+(const vec &a) const { return {x + a.x, y + a.y}; }
  vec operator*(const long double &a) const { return {x * a, y * a}; }
  vec operator-(const vec &a) const { return {x - a.x, y - a.y}; }
  vec operator/(const long double &a) const { return {x / a, y / a}; }
  long double len() const { return sqrt(x * x + y * y); }
  long double dot(const vec &a) const { return x * a.x + y * a.y; }
  long double crs(const vec &a) const { return x * a.y - y * a.x; }
  vec proj(const vec &a) const {
    return (a / a.len()) * (*this).dot(a) / a.len();
  }
};
struct P {
  int x, y;
  bool operator<(const P &a) const { return y > a.y; }
};
bool as(P a, P b) {
  if (a.x != b.x) return a.x < b.x;
  return a.y < b.y;
}
long long x, y, z, mod = 998244853;
vector<int> v[2222];
int i, n, m, k, a, d, b, c, dx[10] = {1, 0, -1, 0}, dy[10] = {0, 1, 0, -1};
int e;
int o[111][111];
int l[111][111];
int j[661];
stack<int> s;
queue<int> q;
P u[1];
string r, r1;
map<int, int> p;
int pp(int x1, int y1, int x2, int y2) {
  printf("? %d %d %d %d\n", x1, y1, x2, y2);
  fflush(stdout);
  int n;
  scanf("%d", &n);
  return n;
}
int f(int x1, int y1, int x2, int y2) {
  if (x1 > x2 || y1 > y2) return 0;
  if (o[x1][y1] != o[x2][y2]) return 0;
  if (x1 == x2 && y1 == y2) return 1;
  if ((x2 + y2) == (x1 + y1) + 1) {
    return 1;
  }
  return max(max(f(x1 + 1, y1, x2 - 1, y2), f(x1 + 1, y1, x2, y2 - 1)),
             max(f(x1, y1 + 1, x2 - 1, y2), f(x1, y1 + 1, x2, y2 - 1)));
}
int g(int x1, int y1, int x2, int y2) {
  if (x1 == x2 && y1 == y2) return 1;
  if (x1 > x2 || y1 > y2) return 0;
  if (o[x1][y1] == o[x2][y2]) return 0;
  if ((x2 + y2) == (x1 + y1) + 1) {
    return 1;
  }
  return max(max(g(x1 + 1, y1, x2 - 1, y2), g(x1 + 1, y1, x2, y2 - 1)),
             max(g(x1, y1 + 1, x2 - 1, y2), g(x1, y1 + 1, x2, y2 - 1)));
}
int main() {
  scanf("%d", &a);
  memset(o, -1, sizeof(o));
  o[1][1] = 1, o[a][a] = 0, o[2][1] = 1;
  o[2][3] = pp(2, 1, 2, 3);
  m = pp(1, 2, 2, 3);
  if (m)
    o[1][2] = o[2][3];
  else
    o[1][2] = 1 - o[2][3];
  for (int t = 1; t <= a; t++)
    for (int w = 1; w <= a; w++)
      if (o[t][w] < 0) {
        if (t > 1 && w > 1) {
          if (pp(t - 1, w - 1, t, w))
            o[t][w] = o[t - 1][w - 1];
          else
            o[t][w] = 1 - o[t - 1][w - 1];
        }
        if (t == 1) {
          if (pp(t, w - 2, t, w))
            o[t][w] = o[t][w - 2];
          else
            o[t][w] = 1 - o[t][w - 2];
        }
        if (w == 1) {
          if (pp(t - 2, w, t, w))
            o[t][w] = o[t - 2][w];
          else
            o[t][w] = 1 - o[t - 2][w];
        }
      }
  for (int t = 1; t <= a; t++)
    for (int w = 1; w <= a; w++) {
      for (int i = 3, j = 0; i >= 0; i--, j++)
        if (o[t + i][w + j] >= 0 &&
            (g(t, w, t + i, w + j) || f(t, w, t + i, w + j))) {
          int p = pp(t, w, t + i, w + j);
          if ((p && g(t, w, t + i, w + j)) || (!p && f(t, w, t + i, w + j))) {
            for (int t = 1; t <= a; t++)
              for (int w = 1; w <= a; w++)
                if ((t + w) % 2) o[t][w] = 1 - o[t][w];
          }
          goto qwe;
        }
    }
qwe:;
  puts("!");
  for (int t = 1; t <= a; t++, puts(""))
    for (int w = 1; w <= a; w++) printf("%d", o[t][w]);
  fflush(stdout);
}
