#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  long long x = 0, f = 1;
  char c = getchar();
  while ((c < '0' || c > '9') && (c != '-')) c = getchar();
  if (c == '-') f = -1, c = getchar();
  while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  return x * f;
}
const int N = 51;
int n, ans[N][N], Ans[N][N];
inline bool Query(int x1, int y1, int x2, int y2) {
  printf("? %d %d %d %d\n", x1, y1, x2, y2);
  return fflush(stdout), read();
}
inline void Print(int a[51][51]) {
  printf("!\n");
  for (register int i = (1); i <= (n); i++) {
    for (register int j = (1); j <= (n); j++) printf("%d", a[i][j]);
    puts("");
  }
  exit(0);
}
inline bool check(int a[51][51], int x, int y) {
  return (a[x][y] == a[x + 1][y + 2] &&
          (a[x + 1][y] == a[x + 1][y + 1] || a[x][y + 1] == a[x][y + 2] ||
           a[x][y + 1] == a[x + 1][y + 1]));
}
inline bool check() {
  for (register int i = (1); i <= (n - 1); i++)
    for (register int j = (1); j <= (n - 2); j++)
      if (check(ans, i, j) != check(Ans, i, j))
        return (check(ans, i, j) == Query(i, j, i + 1, j + 2));
}
int main() {
  n = read();
  memset(ans, -1, sizeof ans);
  ans[1][1] = 1, ans[1][2] = 1, ans[2][3] = Query(1, 2, 2, 3);
  if (ans[2][3])
    ans[2][1] = Query(2, 1, 2, 3);
  else
    ans[2][1] = Query(2, 1, 2, 3) ^ 1;
  ans[n][n] = 0;
  for (register int i = (1); i <= (n); i++)
    for (register int j = (1); j <= (n); j++) {
      if (ans[i][j] != -1) continue;
      if (j == 1)
        ans[i][j] = Query(i - 2, j, i, j) ^ (ans[i - 2][j] ^ 1);
      else if (i == 1)
        ans[i][j] = Query(i, j - 2, i, j) ^ (ans[i][j - 2] ^ 1);
      else
        ans[i][j] = Query(i - 1, j - 1, i, j) ^ (ans[i - 1][j - 1] ^ 1);
    }
  for (register int i = (1); i <= (n); i++)
    for (register int j = (1); j <= (n); j++)
      Ans[i][j] = (i + j & 1) ? ans[i][j] ^ 1 : ans[i][j];
  if (check())
    Print(ans);
  else
    Print(Ans);
}
