#include <bits/stdc++.h>
using namespace std;
int ask(int x1, int y1, int x2, int y2) {
  printf("? %d %d %d %d\n", x1, y1, x2, y2);
  fflush(stdout);
  int tmp;
  scanf("%d", &tmp);
  return tmp ^ 1;
}
const int N = 55;
int ans[N][N], n;
bool vis[N][N];
inline void get(int x1, int y1, int x2, int y2) {
  if (x2 <= n && y2 <= n && !vis[x2][y2])
    vis[x2][y2] = 1, ans[x2][y2] = ans[x1][y1] ^ ask(x1, y1, x2, y2);
}
int main() {
  ans[1][1] = 1;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      get(i, j, i + 1, j + 1);
      get(i, j, i + 2, j);
      get(i, j, i, j + 2);
    }
    if (i == 1) ans[2][1] = ans[2][3] ^ ask(2, 1, 2, 3);
  }
  int tmp = 1;
  for (int i = 1; i < n - 1; i++)
    for (int j = 1; j < n; j++)
      if (((i + j) & 1) == 0 && ((ans[i + 1][j + 1] != ans[i + 2][j] ||
                                  (ans[i + 1][j] == ans[i][j + 1] &&
                                   !(ans[i][j] ^ ans[i + 1][j + 1] ^
                                     ans[i + 1][j] ^ ans[i + 2][j + 1]))))) {
        tmp = (ans[i][j] ^ ans[i + 2][j + 1] ^ ask(i, j, i + 2, j + 1));
        goto NXT;
      }
  for (int i = 1; i < n; i++)
    for (int j = 1; j < n - 1; j++)
      if (((i + j) & 1) == 0 && ((ans[i + 1][j + 1] != ans[i][j + 2] ||
                                  (ans[i + 1][j] == ans[i][j + 1] &&
                                   !(ans[i][j] ^ ans[i + 1][j + 1] ^
                                     ans[i][j + 1] ^ ans[i + 1][j + 2]))))) {
        tmp = (ans[i][j] ^ ans[i + 1][j + 2] ^ ask(i, j, i + 1, j + 2));
        goto NXT;
      }
NXT:
  puts("!");
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++)
      printf("%d", ans[i][j] ^ (((i + j) & 1) & tmp));
    puts("");
  }
  return 0;
}
