#include <bits/stdc++.h>
using namespace std;
int n;
int ans[55][55], col[55][55], used[55][55];
int ask(int x1, int Emilia, int x2, int y2) {
  if (x1 + Emilia + 2 > x2 + y2) {
    swap(x1, x2);
    swap(Emilia, y2);
  }
  cout << "? " << x1 << " " << Emilia << " " << x2 << " " << y2 << endl;
  int result;
  cin >> result;
  if (result == -1) exit(0);
  return result;
}
bool valid(int x1, int Emilia) {
  return x1 >= 1 && x1 <= n && Emilia >= 1 && Emilia <= n;
}
void bfs(int x1, int Emilia) {
  queue<pair<int, int> > q;
  vector<int> dx = {2, -2, 0, 0, 1};
  vector<int> dy = {0, 0, 2, -2, 1};
  q.push(make_pair(x1, Emilia));
  col[x1][Emilia] = 1;
  used[x1][Emilia] = 1;
  while (!q.empty()) {
    pair<int, int> v = q.front();
    q.pop();
    for (int i = 0; i < 5; ++i) {
      int new_x = v.first + dx[i];
      int new_y = v.second + dy[i];
      if (valid(new_x, new_y) && !used[new_x][new_y]) {
        int result = ask(v.first, v.second, new_x, new_y);
        if (result == 1)
          col[new_x][new_y] = col[v.first][v.second];
        else
          col[new_x][new_y] = 1 - col[v.first][v.second];
        used[new_x][new_y] = 1;
        q.push(make_pair(new_x, new_y));
      }
    }
  }
}
bool can(vector<int> q, vector<vector<int> > A) {
  bool result = false;
  int x1 = q[0], Emilia = q[1];
  int x2 = q[2], y2 = q[3];
  if (A[x1][Emilia] != A[x2][y2]) return false;
  vector<int> dx = {1, -1, 0, 0};
  vector<int> dy = {0, 0, 1, -1};
  for (int i = 0; i < 4; ++i) {
    for (int j = 0; j < 4; ++j) {
      int x3 = x1 + dx[i];
      int y3 = Emilia + dy[i];
      int x4 = x2 + dx[j];
      int y4 = y2 + dy[j];
      if (x3 < 0 || y3 < 0 || x4 < 0 || y4 < 0) continue;
      if (x3 > 2 || y3 > 2 || x4 > 2 || x4 > 2) continue;
      int diff = abs(x3 + y3 - x4 - y4);
      bool ok = true;
      if (diff != 1 || A[x3][y3] != A[x4][y4]) ok = false;
      result |= ok;
    }
  }
  return result;
}
int main() {
  ios_base ::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  bfs(1, 2);
  bfs(1, 1);
  int id = -1;
  for (int i = 1; i <= n - 2; ++i) {
    int j = i + 2;
    if (col[i][i] == 1 && col[j][j] == 0) {
      id = i;
      break;
    }
  }
  vector<vector<int> > A(3), B(3);
  for (int i = 0; i < 3; ++i) A[i].resize(3), B[i].resize(3);
  for (int i = 0; i < 3; ++i) {
    for (int j = 0; j < 3; ++j) {
      A[i][j] = col[id + i][id + j];
      if ((i + j) % 2 == 0)
        B[i][j] = col[id + i][id + j];
      else
        B[i][j] = 1 - col[id + i][id + j];
    }
  }
  vector<vector<int> > queries;
  queries.push_back({0, 0, 2, 1});
  queries.push_back({0, 0, 1, 2});
  queries.push_back({0, 1, 2, 2});
  queries.push_back({1, 0, 2, 2});
  bool withA = true;
  for (int i = 0; i < 4; ++i) {
    bool resA = (can(queries[i], A));
    bool resB = (can(queries[i], B));
    if (resA != resB) {
      int x1 = queries[i][0] + id, Emilia = queries[i][1] + id;
      int x2 = queries[i][2] + id, y2 = queries[i][3] + id;
      int reality = (bool)ask(x1, Emilia, x2, y2);
      if (resB == reality) withA = false;
      break;
    }
  }
  cout << "!\n";
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) {
      if ((i + j) % 2 == 1 && withA == false) col[i][j] = 1 - col[i][j];
      cout << col[i][j];
    }
    cout << endl;
  }
  return 0;
}
