#include <bits/stdc++.h>
using namespace std;
void query(int a, int b, int c, int d) {
  cout << "? " << a << ' ' << b << ' ' << c << ' ' << d << '\n';
  cout.flush();
}
int inp() {
  int t;
  cin >> t;
  return t;
}
void print(bool grid[69][69], int n, bool flippyfuck) {
  cout << "!\n";
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if ((i + j) & 1 && flippyfuck) grid[i][j] = !(grid[i][j]);
      if (grid[i][j])
        cout << 1;
      else
        cout << 0;
    }
    cout << '\n';
  }
  cout.flush();
}
int main() {
  bool grid[69][69];
  memset(grid, 0, sizeof grid);
  int n;
  cin >> n;
  grid[1][1] = 1;
  grid[n][n] = 0;
  for (int i = 1; i <= n; i += 2) {
    for (int j = 3; j <= n; j += 2) {
      if (i == n && j == n) break;
      query(i, j - 2, i, j);
      int res = inp();
      if (res == 1)
        grid[i][j] = grid[i][j - 2];
      else
        grid[i][j] = !(grid[i][j - 2]);
    }
    if (i != n) {
      query(i, 1, i + 2, 1);
      int res = inp();
      if (res == 1)
        grid[i + 2][1] = grid[i][1];
      else
        grid[i + 2][1] = !(grid[i][1]);
    }
  }
  for (int i = 2; i <= n; i += 2) {
    query(i - 1, 1, i, 2);
    int res = inp();
    if (res == 1)
      grid[i][2] = grid[i - 1][1];
    else
      grid[i][2] = !(grid[i - 1][1]);
    for (int j = 4; j <= n; j += 2) {
      query(i, j - 2, i, j);
      int res = inp();
      if (res == 1)
        grid[i][j] = grid[i][j - 2];
      else
        grid[i][j] = !(grid[i][j - 2]);
    }
  }
  for (int i = 1; i <= n; i += 2) {
    for (int j = 4; j <= n; j += 2) {
      query(i, j - 2, i, j);
      int res = inp();
      if (res == 1)
        grid[i][j] = grid[i][j - 2];
      else
        grid[i][j] = !(grid[i][j - 2]);
    }
    if (i != n) {
      query(i, 2, i + 2, 2);
      int res = inp();
      if (res == 1)
        grid[i + 2][2] = grid[i][2];
      else
        grid[i + 2][2] = !(grid[i][2]);
    }
  }
  for (int i = 2; i <= n; i += 2) {
    query(i - 1, n - 1, i, n);
    int res = inp();
    if (res == 1)
      grid[i][n] = grid[i - 1][n - 1];
    else
      grid[i][n] = !(grid[i - 1][n - 1]);
    for (int j = n - 2; j >= 0; j -= 2) {
      query(i, j, i, j + 2);
      int res = inp();
      if (res == 1)
        grid[i][j] = grid[i][j + 2];
      else
        grid[i][j] = !(grid[i][j + 2]);
    }
  }
  bool flippyfuck = false;
  vector<pair<int, int> > kms;
  vector<int> fuck;
  for (int i = 1; i <= n; i++) {
    kms.push_back(make_pair(1, i));
    fuck.push_back(grid[1][i]);
  }
  for (int i = 2; i <= n; i++) {
    kms.push_back(make_pair(i, n));
    fuck.push_back(grid[i][n]);
  }
  for (int i = 0; i < 2 * n - 4; i++) {
    if ((fuck[i] == fuck[i + 2] && fuck[i + 1] == fuck[i + 3]) ||
        (fuck[i] != fuck[i + 2] && fuck[i + 1] != fuck[i + 3])) {
      query(kms[i].first, kms[i].second, kms[i + 3].first, kms[i + 3].second);
      int res = inp();
      if (res == 1 && fuck[i] != fuck[i + 3]) flippyfuck = true;
      if (res == 0 && fuck[i] == fuck[i + 3]) flippyfuck = true;
      break;
    }
  }
  print(grid, n, flippyfuck);
}
