#include <bits/stdc++.h>
using namespace std;
const int MAXN = 55;
int a[MAXN][MAXN];
int n;
int query(int x1, int y1, int x2, int y2) {
  int ret;
  printf("? %d %d %d %d\n", x1, y1, x2, y2);
  fflush(stdout);
  scanf("%d", &ret);
  return ret ^ 1;
}
int main() {
  bool flag = false;
  scanf("%d", &n);
  a[1][1] = 1;
  a[n][n] = 0;
  a[2][1] = a[1][2] ^ query(1, 2, 2, 3) ^ query(2, 1, 2, 3);
  for (int i = 3; i <= n; i++) {
    a[i][1] = a[i - 2][1] ^ query(i - 2, 1, i, 1);
    a[1][i] = a[1][i - 2] ^ query(1, i - 2, 1, i);
  }
  for (int i = 2; i <= n; i++)
    for (int j = 2; j <= n; j++)
      a[i][j] = a[i - 1][j - 1] ^ query(i - 1, j - 1, i, j);
  for (int i = 1; i + 2 <= n; i += 2) {
    if (a[i][i] ^ a[i + 2][i + 2]) {
      if (!((a[i][i] ^ a[i][i + 2]) ^ (a[i][i + 1] ^ a[i + 1][i + 2])))
        flag = a[i][i] ^ query(i, i, i + 1, i + 2) ^ a[i + 1][i + 2];
      else
        flag = a[i + 2][i + 2] ^ query(i, i + 1, i + 2, i + 2) ^ a[i][i + 1];
      break;
    }
  }
  printf("!\n");
  fflush(stdout);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if ((i + j) % 2) a[i][j] ^= flag;
      printf("%d", a[i][j]);
    }
    puts("");
    fflush(stdout);
  }
  return 0;
}
