#include <bits/stdc++.h>
int N;
int A[50][50];
int query(int x1, int y1, int x2, int y2) {
  int ans;
  printf("? %d %d %d %d\n", x1 + 1, y1 + 1, x2 + 1, y2 + 1);
  fflush(stdout);
  scanf("%d", &ans);
  return ans;
}
void answer() {
  puts("!");
  for (int i = 0; i < N; ++i) {
    for (int j = 0; j < N; ++j) printf("%d", A[i][j]);
    puts("");
  }
}
int main() {
  scanf("%d", &N);
  A[0][0] = 1;
  A[N - 1][N - 1] = 0;
  A[0][1] = 1;
  for (int i = 2; i < N; ++i) A[0][i] = A[0][i - 2] ^ query(0, i - 2, 0, i) ^ 1;
  A[1][N - 1] = A[0][N - 2] ^ query(0, N - 2, 1, N - 1) ^ 1;
  A[1][N - 2] = A[0][N - 3] ^ query(0, N - 3, 1, N - 2) ^ 1;
  for (int i = N - 3; i >= 0; --i)
    A[1][i] = A[1][i + 2] ^ query(1, i, 1, i + 2) ^ 1;
  for (int i = 2; i < N; ++i)
    for (int j = 0; j < N; ++j)
      A[i][j] = A[i - 2][j] ^ query(i - 2, j, i, j) ^ 1;
  int i, j;
  for (i = 1; i < N; ++i)
    for (j = 2; j < N; ++j) {
      if ((A[i - 1][j - 2] ^ A[i - 1][j - 1] ^ A[i][j - 1] ^ A[i][j]) == 0) {
        goto OUT;
      }
    }
  abort();
OUT:
  if ((query(i - 1, j - 2, i, j) ^ 1) != (A[i - 1][j - 2] ^ A[i][j])) {
    for (int i = 0; i < N; ++i)
      for (int j = 0; j < N; ++j) {
        if ((i + j) % 2 == 1) A[i][j] ^= 1;
      }
  }
  answer();
  return 0;
}
