#include <bits/stdc++.h>
using namespace std;
class Init {
 public:
  Init() noexcept try {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
  } catch (...) {
    cerr << "Init constructor threw an exception" << endl;
    terminate();
  }
} __init __attribute__((unused));
using ll = long long;
using ld = long double;
using pi = pair<int, int>;
using pl = pair<ll, ll>;
using ti = tuple<int, int, int>;
using tl = tuple<ll, ll, ll>;
template <typename T>
istream &operator>>(istream &in, vector<T> &v);
template <typename U, typename V>
istream &operator>>(istream &in, pair<U, V> &p);
template <typename T>
ostream &operator<<(ostream &out, const vector<T> &v);
template <typename U, typename V>
ostream &operator<<(ostream &out, const pair<U, V> &p);
template <typename T>
istream &operator>>(istream &in, vector<T> &v) {
  for (T &i : v) in >> i;
  return in;
}
template <typename U, typename V>
istream &operator>>(istream &in, pair<U, V> &p) {
  return in >> p.first >> p.second;
}
template <typename T>
ostream &operator<<(ostream &out, const vector<T> &v) {
  auto it = v.begin();
  if (!v.empty()) out << *it++;
  while (it != v.end()) out << " " << *it++;
  return out;
}
template <typename U, typename V>
ostream &operator<<(ostream &out, const pair<U, V> &p) {
  return out << p.first << " " << p.second;
}
int cnt = 0, n;
int ask(int x1, int y1, int x2, int y2) {
  cnt++;
  if (cnt > n * n)
    while (1)
      ;
  cout << "? " << x1 + 1 << " " << y1 + 1 << " " << x2 + 1 << " " << y2 + 1
       << "\n"
       << flush;
  int n;
  cin >> n;
  return n;
}
int d[55][55], dx[] = {0, 1, 2}, dy[] = {2, 1, 0};
void ans(int n) {
  cout << "!"
       << "\n";
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      cout << d[i][j];
    }
    cout << "\n";
  }
}
int main() {
  cin >> n;
  queue<pair<int, int>> q;
  q.emplace(0, 0);
  d[0][0] = 1;
  d[n - 1][n - 1] = 2;
  while (!q.empty()) {
    auto [a, b] = q.front();
    q.pop();
    for (int i = 0; i < 3; i++) {
      int nx = a + dx[i];
      int ny = b + dy[i];
      if (nx >= n || ny >= n) continue;
      if (d[nx][ny] == 0) {
        int t = ask(a, b, nx, ny);
        if (t == 0) {
          d[nx][ny] = (d[a][b] % 2 == 0 ? d[a][b] - 1 : d[a][b] + 1);
        } else {
          d[nx][ny] = d[a][b];
        }
        q.emplace(nx, ny);
      }
    }
  }
  d[1][0] = 3;
  q.emplace(1, 0);
  while (!q.empty()) {
    auto [a, b] = q.front();
    q.pop();
    for (int i = 0; i < 3; i++) {
      int nx = a + dx[i];
      int ny = b + dy[i];
      if (nx >= n || ny >= n) continue;
      if (d[nx][ny] == 0) {
        int t = ask(a, b, nx, ny);
        if (t == 0) {
          d[nx][ny] = (d[a][b] % 2 == 0 ? d[a][b] - 1 : d[a][b] + 1);
        } else {
          d[nx][ny] = d[a][b];
        }
        q.emplace(nx, ny);
      }
    }
  }
  for (int i = 1; i < n; i += 2) {
    if (ask(0, i, 1, i + 1))
      d[0][i] = d[1][i + 1];
    else
      d[0][i] = 7 - d[1][i + 1];
  }
  int f = 0, flag = 0;
  for (int i = 2; i < n; i++) {
    for (int j = 1; j < n; j++) {
      if ((d[i - 2][j - 1] == d[i][j - 1] && d[i - 1][j - 1] == d[i][j]) ||
          (d[i - 2][j - 1] != d[i][j - 1] && d[i - 1][j - 1] != d[i][j]) ||
          (d[i - 2][j - 1] == d[i - 1][j] && d[i - 1][j - 1] == d[i][j]) ||
          (d[i - 2][j - 1] != d[i - 1][j] && d[i - 1][j - 1] != d[i][j]) ||
          (d[i - 2][j - 1] == d[i - 1][j] && d[i - 2][j] == d[i][j]) ||
          (d[i - 2][j - 1] != d[i - 1][j] && d[i - 2][j] != d[i][j])) {
        f = ask(i - 2, j - 1, i, j);
        if (d[i - 2][j - 1] % 2 == d[i][j] % 2) f = 1 - f;
        flag = 1;
        break;
      }
    }
    if (flag) break;
  }
  for (int i = 2; i < n; i++) {
    for (int j = 1; j < n; j++) {
      if (flag) break;
      if ((d[j - 1][i - 2] == d[j - 1][i] && d[j - 1][i - 1] == d[j][i]) ||
          (d[j - 1][i - 2] != d[j - 1][i] && d[j - 1][i - 1] != d[j][i]) ||
          (d[j - 1][i - 2] == d[j][i - 1] && d[j - 1][i - 1] == d[j][i]) ||
          (d[j - 1][i - 2] != d[j][i - 1] && d[j - 1][i - 1] != d[j][i]) ||
          (d[j - 1][i - 2] == d[j][i - 1] && d[j][i - 2] == d[j][i]) ||
          (d[j - 1][i - 2] != d[j][i - 1] && d[j][i - 2] != d[j][i])) {
        f = ask(j - 1, i - 2, j, i);
        if (d[j - 1][i - 2] % 2 == d[j][i] % 2) f = 1 - f;
        flag = 1;
        break;
      }
    }
    if (flag) break;
  }
  assert(flag == 1);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if (d[i][j] == 2) d[i][j] = 0;
      if (d[i][j] >= 3) {
        d[i][j] -= 3;
        if (!f) d[i][j] = 1 - d[i][j];
      }
    }
  }
  ans(n);
}
