#include <bits/stdc++.h>
using namespace std;
template <typename T>
void printMatrix(const string &txt, vector<vector<T>> &a) {
  cout << txt;
  for (int i = 0; i < a.size(); ++i) {
    for (int j = 0; j < a[i].size(); ++j) cout << a[i][j];
    cout << endl;
  }
}
template <typename T>
void printVector(const string &txt, vector<T> &a) {
  cout << txt;
  for (int i = 0; i < a.size(); ++i) cout << a[i] << ' ';
  cout << endl;
}
int n;
vector<vector<int>> mat;
vector<vector<int>> test;
bool findPal(int r, int c, int fr, int fc, vector<int> &p) {
  p.push_back(test[r][c]);
  if (r == fr && c == fc) {
    vector<int> tmp = p;
    reverse(tmp.begin(), tmp.end());
    if (tmp == p) return true;
    p.pop_back();
    return false;
  }
  bool res = false;
  if (r < fr) {
    res = findPal(r + 1, c, fr, fc, p);
    if (res) return true;
  }
  if (c < fc) res |= findPal(r, c + 1, fr, fc, p);
  if (res == true) return true;
  p.pop_back();
  return false;
}
int doRequest(int y1, int x1, int y2, int x2) {
  cout << "? " << y1 << " " << x1 << " " << y2 << " " << x2 << endl;
  int res;
  cin >> res;
  return res;
}
vector<vector<int>> s4, s5;
void genS(int fin_len, int curr_len, vector<int> &path,
          vector<vector<int>> &res) {
  if (curr_len == fin_len - 1) {
    reverse(path.begin(), path.end());
    res.push_back(path);
    return;
  }
  path.push_back(0);
  genS(fin_len, curr_len + 1, path, res);
  path.pop_back();
  path.push_back(1);
  genS(fin_len, curr_len + 1, path, res);
  path.pop_back();
  return;
}
int lr, lc;
bool palExist(int row, int col, vector<vector<int>> &mat_,
              vector<vector<int>> &s) {
  int len = s[0].size();
  vector<int> str;
  for (int i = 0; i < s.size(); ++i) {
    int r = row, c = col;
    str.push_back(mat_[r][c]);
    for (int j = 0; j < len; ++j) {
      if (s[i][j] == 1)
        --r;
      else
        --c;
      if (r < 0 || c < 0)
        break;
      else
        str.push_back(mat_[r][c]);
    }
    if (str.size() < len + 1) {
      str.clear();
      continue;
    }
    vector<int> tmp = str;
    reverse(tmp.begin(), tmp.end());
    if (tmp == str) {
      lr = r;
      lc = c;
      return true;
    }
    str.clear();
  }
  return false;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie();
  cin >> n;
  mat.resize(n);
  for (int i = 0; i < n; ++i) mat[i].resize(n, 0);
  mat[0][0] = 1;
  mat[n - 1][n - 1] = 0;
  for (int i = 2; i < n; i += 2) {
    if (doRequest(i + 1 - 2, 1, i + 1, 1))
      mat[i][0] = mat[i - 2][0];
    else
      mat[i][0] = mat[i - 2][0] ^ 1;
  }
  for (int i = 0; i < n; i += 2) {
    for (int j = 2; j < n; j += 2) {
      if (i == j && j == n - 1) break;
      mat[i][j] = mat[i][j - 2] ^ 1 ^ doRequest(i + 1, j + 1 - 2, i + 1, j + 1);
    }
  }
  mat[1][1] = doRequest(1, 1, 2, 2);
  for (int i = 1; i < n; i += 2) {
    mat[i][1] = mat[i - 1][0] ^ 1 ^ doRequest(i - 1 + 1, 1, i + 1, 2);
    for (int j = 3; j < n; j += 2) {
      mat[i][j] = mat[i][j - 2] ^ 1 ^ doRequest(i + 1, j + 1 - 2, i + 1, j + 1);
    }
  }
  vector<vector<int>> mat1 = mat;
  vector<vector<int>> mat2 = mat;
  mat1[0][1] = 0;
  for (int i = 2; i < n; i += 2)
    mat1[i][1] = mat1[i - 2][1] ^ doRequest(i + 1 - 2, 2, i + 1, 2) ^ 1;
  for (int i = 0; i < n; i += 2) {
    for (int j = 3; j < n; j += 2) {
      mat1[i][j] =
          mat1[i][j - 2] ^ 1 ^ doRequest(i + 1, j + 1 - 2, i + 1, j + 1);
    }
  }
  for (int i = 1; i < n; i += 2) {
    mat1[i][0] = doRequest(i + 1, 1, i + 1 + 1, 2) ^ mat1[i + 1][1] ^ 1;
    for (int j = 2; j < n; j += 2) {
      mat1[i][j] =
          mat1[i][j - 2] ^ 1 ^ doRequest(i + 1, j + 1 - 2, i + 1, j + 1);
    }
  }
  for (int i = 0; i < n; ++i)
    for (int j = (i + 1) % 2; j < n; j += 2) mat2[i][j] = mat1[i][j] ^ 1;
  {
    vector<int> path;
    genS(4, 0, path, s4);
    genS(5, 0, path, s5);
  }
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n; ++j) {
      if (i + j < 3) continue;
      int e1 = palExist(i, j, mat1, s4);
      int e2 = palExist(i, j, mat2, s4);
      if (e1 != e2) {
        int r = doRequest(lr + 1, lc + 1, i + 1, j + 1);
        if (r == 1) {
          if (e1) {
            printMatrix("!\n", mat1);
          } else {
            printMatrix("!\n", mat2);
          }
          return 0;
        } else {
          if (e1)
            printMatrix("!\n", mat2);
          else
            printMatrix("!\n", mat1);
          printMatrix("??\n", mat1);
          return 0;
        }
      }
    }
  }
  return 0;
}
