#include <bits/stdc++.h>
using namespace std;
const int N = 60;
int n, A[N][N], x;
int getans(int x1, int y1, int x2, int y2);
void turnr();
void rore() {
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++)
      for (int k = 0; k < 4; k++)
        if (i + k <= n && j + 3 - k <= n && getans(i, j, i + k, j + 3 - k)) {
          printf("? %d %d %d %d\n", i, j, i + k, j + 3 - k);
          fflush(stdout);
          scanf("%d", &x);
          if (x == 1 && A[i][j] != A[i + k][j + 3 - k]) turnr();
          if (x == 0 && A[i][j] == A[i + k][j + 3 - k]) turnr();
          return;
        }
  return;
}
int main() {
  memset(A, 0, sizeof(A));
  A[1][1] = 1;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) {
      if (i == 2 && j == 1) {
        printf("? 2 1 2 3\n");
        fflush(stdout);
        scanf("%d", &x);
        if (x == 0) A[2][1] = (A[2][3] == 1) ? 0 : 1;
        if (x == 1) A[2][1] = (A[2][3] == 1) ? 1 : 0;
      }
      if (i == 1 && j + 2 <= n) {
        printf("? %d %d %d %d\n", i, j, i, j + 2);
        fflush(stdout);
        scanf("%d", &x);
        if (x == 0) A[i][j + 2] = (A[i][j] == 1) ? 0 : 1;
        if (x == 1) A[i][j + 2] = (A[i][j] == 1) ? 1 : 0;
      }
      if (j == 1 && i + 2 <= n) {
        printf("? %d %d %d %d\n", i, j, i + 2, j);
        fflush(stdout);
        scanf("%d", &x);
        if (x == 0) A[i + 2][j] = (A[i][j] == 1) ? 0 : 1;
        if (x == 1) A[i + 2][j] = (A[i][j] == 1) ? 1 : 0;
      }
      if (i + 1 <= n && j + 1 <= n && i + j + 2 < n + n) {
        printf("? %d %d %d %d\n", i, j, i + 1, j + 1);
        fflush(stdout);
        scanf("%d", &x);
        if (x == 0) A[i + 1][j + 1] = (A[i][j] == 1) ? 0 : 1;
        if (x == 1) A[i + 1][j + 1] = (A[i][j] == 1) ? 1 : 0;
      }
    }
  rore();
  printf("!\n");
  fflush(stdout);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      printf("%d", A[i][j]);
      fflush(stdout);
    }
    printf("\n");
    fflush(stdout);
  }
  return 0;
}
int getans(int x1, int y1, int x2, int y2) {
  if (x1 == x2)
    return 1 ^ A[x1][y1] ^ A[x1][y1 + 1] ^ A[x1][y1 + 2] ^ A[x1][y2];
  if (x1 + 1 == x2) {
    int t = A[x1][y1] ^ A[x2][y2];
    return (t == (A[x1 + 1][y1] ^ A[x1 + 1][y1 + 1])) ||
           (t == (A[x1][y1 + 1] ^ A[x1 + 1][y1 + 1])) ||
           (t == (A[x1][y1 + 1] ^ A[x1][y1 + 2]));
  }
  if (x1 + 2 == x2) {
    int t = A[x1][y1] ^ A[x2][y2];
    return (t == (A[x1 + 1][y1] ^ A[x1 + 2][y1])) ||
           (t == (A[x1 + 1][y1] ^ A[x1 + 1][y1 + 1])) ||
           (t == (A[x1][y1 + 1] ^ A[x1 + 1][y1 + 1]));
  }
  if (x1 + 3 == x2)
    return 1 ^ A[x1][y1] ^ A[x1 + 1][y1] ^ A[x1 + 2][y1] ^ A[x2][y1];
  return 0;
}
void turnr() {
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= n; ++j)
      if ((i + j) % 2) A[i][j] = (A[i][j] == 1) ? 0 : 1;
  return;
}
