#include <bits/stdc++.h>
using namespace std;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  long long n;
  cin >> n;
  auto ask = [&](long long x1, long long y1, long long x2, long long y2) {
    cout << "? " << x1 + 1 << " " << y1 + 1 << " " << x2 + 1 << " " << y2 + 1
         << endl;
    long long v;
    cin >> v;
    if (v == -1) {
      exit(0);
    }
    return v == 1;
  };
  auto ans = [&](vector<vector<bool>> &i) {
    cout << "!" << endl;
    for (vector<bool> &j : i) {
      for (long long k : j) {
        cout << (k ? 1 : 0);
      }
      cout << endl;
    }
  };
  vector<vector<bool>> a((size_t)n, vector<bool>((size_t)n)),
      b((size_t)n, vector<bool>((size_t)n));
  a[0][0] = true;
  a[0][1] = false;
  for (long long x = 0; x < n; x++) {
    for (long long y = 0; y < n; y++) {
      if (x != 0 || y >= 2) {
        if (x == 0 || y >= 3) {
          a[x][y] = a[x][y - 2] == ask(x, y - 2, x, y);
        } else if (y == 0) {
          a[x][y] = ask(x, y, x, y + 2);
        } else if (y == 1) {
          a[x][y] = a[x - 1][y - 1] == ask(x - 1, y - 1, x, y);
        } else if (y == 2) {
          a[x][y] = a[x - 1][y - 1] == ask(x - 1, y - 1, x, y);
          a[x][y - 2] = a[x][y] == a[x][y - 2];
        }
      }
    }
  }
  for (long long x = 0; x < n; x++) {
    for (long long y = 0; y < n; y++) {
      b[x][y] = a[x][y] != ((x + y) % 2 != 0);
    }
  }
  auto coord = [&](long long x1, long long y1, long long x2, long long y2) {
    return x1 * n * n * n + y1 * n * n + x2 * n + y2;
  };
  auto build = [&](vector<vector<bool>> &u, vector<bool> &v) {
    for (long long xd = 0; xd < n; xd++) {
      for (long long yd = 0; yd < n; yd++) {
        for (long long x1 = 0, x2 = xd; x2 < n; x1++, x2++) {
          for (long long y1 = 0, y2 = yd; y2 < n; y1++, y2++) {
            if (x1 != x2 || y1 != y2) {
              if (u[x1][y1] == u[x2][y2]) {
                bool i = abs(x1 - x2) <= 1;
                bool j = abs(y1 - y2) <= 1;
                if (i && j) {
                  v[coord(x1, y1, x2, y2)] = true;
                } else if (i) {
                  v[coord(x1, y1, x2, y2)] = v[coord(x1, y1 + 1, x2, y2 - 1)];
                } else if (j) {
                  v[coord(x1, y1, x2, y2)] = v[coord(x1 + 1, y1, x2 - 1, y2)];
                } else {
                  v[coord(x1, y1, x2, y2)] = v[coord(x1, y1, x2, y2)] ||
                                             v[coord(x1 + 1, y1, x2 - 1, y2)];
                  v[coord(x1, y1, x2, y2)] = v[coord(x1, y1, x2, y2)] ||
                                             v[coord(x1, y1 + 1, x2 - 1, y2)];
                  v[coord(x1, y1, x2, y2)] = v[coord(x1, y1, x2, y2)] ||
                                             v[coord(x1 + 1, y1, x2, y2 - 1)];
                  v[coord(x1, y1, x2, y2)] = v[coord(x1, y1, x2, y2)] ||
                                             v[coord(x1, y1 + 1, x2, y2 - 1)];
                }
              }
            }
          }
        }
      }
    }
  };
  vector<bool> c((size_t)n * n * n * n, false), d((size_t)n * n * n * n, false);
  build(a, c);
  build(b, d);
  for (long long x1 = 0; x1 < n; x1++) {
    for (long long y1 = 0; y1 < n; y1++) {
      for (long long x2 = x1; x2 < n; x2++) {
        for (long long y2 = y1; y2 < n; y2++) {
          if (x1 + y1 + 2 <= x2 + y2) {
            if (c[coord(x1, y1, x2, y2)] && !d[coord(x1, y1, x2, y2)]) {
              ans(ask(x1, y1, x2, y2) ? a : b);
              return 0;
            }
            if (!c[coord(x1, y1, x2, y2)] && d[coord(x1, y1, x2, y2)]) {
              ans(ask(x1, y1, x2, y2) ? b : a);
              return 0;
            }
          }
        }
      }
    }
  }
  return 0;
}
