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