#include <bits/stdc++.h>
using namespace std;
using ll = long long;
bool query(int x1, int y1, int x2, int y2) {
  x1++;
  y1++;
  x2++;
  y2++;
  printf("? %d %d %d %d\n", x1, y1, x2, y2);
  fflush(stdout);
  int answer;
  scanf("%d", &answer);
  return answer > 0;
}
int main() {
  int n;
  scanf("%d", &n);
  bool answer[n][n];
  answer[0][0] = true;
  answer[0][1] = true;
  answer[n - 1][n - 1] = false;
  for (int j = 0; j + 2 < n; j++) {
    if (query(0, j, 0, j + 2)) {
      answer[0][j + 2] = answer[0][j];
    } else {
      answer[0][j + 2] = !answer[0][j];
    }
  }
  for (int i = 0; i + 1 < n; i++) {
    for (int j = 0; j + 1 < n; j++) {
      if (!(i + 1 == n - 1 && j + 1 == n - 1)) {
        if (query(i, j, i + 1, j + 1)) {
          answer[i + 1][j + 1] = answer[i][j];
        } else {
          answer[i + 1][j + 1] = !answer[i][j];
        }
      }
    }
    if (query(i + 1, 0, i + 1, 2)) {
      answer[i + 1][0] = answer[i + 1][2];
    } else {
      answer[i + 1][0] = !answer[i + 1][2];
    }
  }
  int i = 0;
  while (answer[i + 2][i + 2] == 1) {
    i += 2;
  }
  bool needSwap;
  if ((answer[i][i] ^ answer[i][i + 1] ^ answer[i + 1][i + 1] ^
       answer[i + 2][i + 1]) == 0) {
    needSwap =
        query(i, i, i + 2, i + 1) ^ (answer[i][i] == answer[i + 2][i + 1]);
  } else {
    assert((answer[i][i + 1] ^ answer[i + 1][i + 1] ^ answer[i + 2][i + 1] ^
            answer[i + 2][i + 2]) == 0);
    needSwap = query(i, i + 1, i + 2, i + 2) ^
               (answer[i][i + 1] == answer[i + 2][i + 2]);
  }
  if (needSwap) {
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        if ((i + j) % 2 == 1) {
          answer[i][j] = !answer[i][j];
        }
      }
    }
  }
  printf("!\n");
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      printf("%d", answer[i][j]);
    }
    printf("\n");
  }
  return 0;
}
