#include <bits/stdc++.h>
using namespace std;
int N;
int A[51][51], B[51][51];
int D[51][51][51][51];
int e[4][2] = {0, 1, 1, 0, 1, 2, 2, 1};
int f(int x1, int y1, int x2, int y2) {
  if (D[x1][y1][x2][y2]) return D[x1][y1][x2][y2] - 1;
  if ((x2 + y2) - (x1 + y1) == 2 && B[x1][y1] != -1 && B[x2][y2] != -1) {
    D[x1][y1][x2][y2] = (B[x1][y1] == B[x2][y2]) + 1;
    return B[x1][y1] == B[x2][y2];
  }
  printf("? %d %d %d %d\n", x1, y1, x2, y2);
  fflush(stdout);
  int x;
  scanf("%d", &x);
  D[x1][y1][x2][y2] = x + 1;
  return x;
}
int chk(int x1, int y1, int x2, int y2) {
  if (x1 == x2 && y1 == y2)
    return (A[x1][y1] == A[x2][y2]) == f(x1, y1, x2, y2);
  if ((x2 + y2) - (x1 + y1) == 2)
    return (A[x1][y1] == A[x2][y2]) == f(x1, y1, x2, y2);
  if (x2 - x1 == 1)
    return ((A[x1][y1] == A[x2][y2]) &&
            ((A[x2][y1] == A[x2][y1 + 1]) || (A[x1][y1 + 1] == A[x2][y1 + 1]) ||
             (A[x1][y1 + 1] == A[x1][y2]))) == f(x1, y1, x2, y2);
  return ((A[x1][y1] == A[x2][y2]) &&
          ((A[x1 + 1][y1] == A[x2][y1]) || (A[x1 + 1][y1] == A[x1 + 1][y2]) ||
           (A[x1][y2] == A[x1 + 1][y2]))) == f(x1, y1, x2, y2);
}
int g(int ind, int x, int y) {
  int cnt = 0;
  if (ind == 4) {
    int k =
        chk(x + 0, y + 0, x + 2, y + 1) && chk(x + 0, y + 1, x + 2, y + 2) &&
        chk(x + 0, y + 0, x + 1, y + 2) && chk(x + 1, y + 0, x + 2, y + 2) &&
        chk(x + 0, y + 1, x + 2, y + 1) && chk(x + 1, y + 0, x + 1, y + 2);
    return k;
  } else {
    A[x + e[ind][0]][y + e[ind][1]] = 0;
    if (g(ind + 1, x, y)) return 1;
    A[x + e[ind][0]][y + e[ind][1]] = 1;
    if (g(ind + 1, x, y)) return 1;
  }
  return 0;
}
int ex[8] = {0, 0, -2, 2, -1, -1, 1, 1};
int ey[8] = {-2, 2, 0, 0, -1, 1, -1, 1};
int Set(int x, int y) {
  if (B[x][y] != -1) return B[x][y];
  for (int i = 0; i < 8; i++) {
    int X = x + ex[i];
    int Y = y + ey[i];
    if (X < 1 || X > N || Y < 1 || Y > N) continue;
    if (B[X][Y] == -1) continue;
    if (x <= X && y <= Y)
      return f(x, y, X, Y) ? B[X][Y] : !B[X][Y];
    else
      return f(X, Y, x, y) ? B[X][Y] : !B[X][Y];
  }
  return -1;
}
int main() {
  scanf("%d", &N);
  for (int i = 1; i <= N; i++)
    for (int j = 1; j <= N; j++) B[i][j] = -1;
  B[1][1] = 1;
  B[N][N] = 0;
  for (int i = 1; i <= N; i++) {
    if (i == 1)
      for (int j = 1; j <= N; j++) B[i][j] = Set(i, j);
    else
      for (int j = N; j >= 1; j--) B[i][j] = Set(i, j);
  }
  for (int i = 1; i <= N; i++)
    for (int j = 1; j <= N; j++) A[i][j] = B[i][j];
  int x = -1, y;
  for (int i = 1; x == -1 && i <= N - 2; i += 2) {
    for (int j = 1; x == -1 && j <= N - 2; j += 2) {
      if (A[i][j] != A[i + 2][j + 2]) x = i, y = j;
    }
  }
  g(0, x, y);
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= N; j++) B[i][j] = A[i][j];
  }
  for (int k = 0; k <= N * N; k++) {
    for (int i = 1; i <= N; i++) {
      if (i == 1)
        for (int j = 1; j <= N; j++) B[i][j] = Set(i, j);
      else
        for (int j = N; j >= 1; j--) B[i][j] = Set(i, j);
    }
  }
  printf("!\n");
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= N; j++) printf("%d", B[i][j]);
    printf("\n");
  }
  fflush(stdout);
  return 0;
}
