#include <bits/stdc++.h>
using namespace std;
int query(int y1, int x1, int y2, int x2) {
  cout << "? " << (y1 + 1) << " " << (x1 + 1) << " " << (y2 + 1) << " "
       << (x2 + 1) << endl;
  int x;
  cin >> x;
  return x;
}
int main() {
  int n;
  cin >> n;
  int a[n][n];
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      a[i][j] = 0;
    }
  }
  a[0][0] = 1;
  a[2][1] = 1 ^ query(0, 1, 2, 1);
  a[1][0] = 1 ^ query(1, 0, 2, 1) ^ a[2][1];
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if (i == 0 && j == 0) {
        continue;
      }
      if (i == n - 1 && j == n - 1) {
        continue;
      }
      if (i + j == 1) {
        continue;
      }
      if (i == 2 && j == 1) {
        continue;
      }
      if (i >= 2) {
        a[i][j] = 1 ^ query(i - 2, j, i, j) ^ a[i - 2][j];
      } else if (j >= 2) {
        a[i][j] = 1 ^ query(i, j - 2, i, j) ^ a[i][j - 2];
      } else {
        a[i][j] = 1 ^ query(i - 1, j - 1, i, j) ^ a[i - 1][j - 1];
      }
    }
  }
  bool did = false;
  int ans = 0;
  for (int i = 1; i < n && !did; i++) {
    for (int j = 0; j + 1 < n && !did; j++) {
      if (a[i][j] == a[i - 1][j + 1]) {
        continue;
      }
      if (i - 2 >= 0) {
        int got = query(i - 2, j, i, j + 1);
        if ((got == 1) != (a[i - 2][j] == a[i][j + 1])) {
          ans = 1;
        }
        did = true;
        break;
      }
      if (i + 1 < n) {
        int got = query(i - 1, j, i + 1, j + 1);
        if ((got == 1) != (a[i - 1][j] == a[i + 1][j + 1])) {
          ans = 1;
        }
        did = true;
        break;
      }
    }
  }
  if (!did) {
    vector<pair<int, int> > li;
    vector<int> val;
    for (int i = 0; i < n; i++) {
      li.push_back(make_pair(0, i));
      val.push_back(a[0][i]);
    }
    for (int i = 1; i < n; i++) {
      li.push_back(make_pair(i, n - 1));
      val.push_back(a[i][n - 1]);
    }
    for (int i = 3; i < val.size() && !did; i++) {
      if ((val[i - 3] ^ val[i]) == (val[i - 2] ^ val[i - 1])) {
        int got =
            query(li[i - 3].first, li[i - 3].second, li[i].first, li[i].second);
        if ((got == 1) != (val[i - 3] == val[i])) {
          ans = 1;
        }
        did = true;
        break;
      }
    }
    assert(did);
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if ((i + j) % 2 == 1) {
        a[i][j] ^= ans;
      }
    }
  }
  cout << "!" << endl;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      cout << a[i][j];
    }
    cout << endl;
  }
}
