#include <bits/stdc++.h>
using namespace std;
const int N = 52;
int dx[] = {2, 1, 0}, dy[] = {0, 1, 2}, a[N][N], n, i, j, f1, f2, fl;
void ask(int x, int y, int xx, int yy) {
  printf("? %d %d %d %d\n", x, y, xx, yy);
  fflush(stdout);
  scanf("%d", &fl);
}
void dfs(int x, int y) {
  for (int i = 0; i < 3; i++) {
    int xx = x + dx[i], yy = y + dy[i];
    if (1 <= xx && xx <= n && 1 <= yy && yy <= n && a[xx][yy] == -1) {
      ask(x, y, xx, yy);
      a[xx][yy] = !(a[x][y] ^ fl);
      dfs(xx, yy);
    }
  }
}
void doit(int x, int y, int xx, int yy) {
  if (f1 == f2) return;
  ask(x, y, xx, yy);
  if (fl == f2) {
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++)
        if (i + j & 1) a[i][j] ^= 1;
  }
  puts("!");
  for (i = 1; i <= n; i++, puts(""))
    for (j = 1; j <= n; j++) printf("%d", a[i][j]);
  exit(0);
}
void chk(int X1, int Y1, int X2, int Y2, int X3, int Y3, int X4, int Y4, int X5,
         int Y5, int X6, int Y6) {
  if (X2 > n || Y2 > n) return;
  f1 = a[X1][Y1] == a[X2][Y2] &&
       (a[X3][Y3] == a[X4][Y4] || a[X4][Y4] == a[X5][Y5] ||
        a[X5][Y5] == a[X6][Y6]);
  f2 = a[X1][Y1] != a[X2][Y2] &&
       (a[X3][Y3] != a[X4][Y4] || a[X4][Y4] != a[X5][Y5] ||
        a[X5][Y5] != a[X6][Y6]);
  doit(X1, Y1, X2, Y2);
}
signed main() {
  scanf("%d", &n);
  memset(a, -1, sizeof(a));
  a[1][1] = 1, a[n][n] = 0, dfs(1, 1);
  a[1][2] = 0, dfs(1, 2);
  ask(2, 1, 2, 3), a[2][1] = !(a[2][3] ^ fl);
  dfs(2, 1);
  for (i = 1; i <= n; i++)
    for (j = 1; j <= n; j++) {
      chk(i, j, i + 1, j + 2, i + 1, j, i + 1, j + 1, i, j + 1, i, j + 2);
      chk(i, j, i + 2, j + 1, i, j + 1, i + 1, j + 1, i + 1, j, i + 2, j);
    }
}
