#include <bits/stdc++.h>
using namespace std;
int N, ans[151][151];
int query(int X1, int Y1, int X2, int Y2) {
  printf("? %d %d %d %d\n", X1, Y1, X2, Y2);
  fflush(stdout);
  int ret;
  scanf("%d", &ret);
  return ret;
}
void gao(int X1, int Y1, int X2, int Y2) {
  ans[X2][Y2] = ans[X1][Y1] ^ (!query(X1, Y1, X2, Y2));
}
void print() {
  puts("!");
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= N; j++) {
      printf("%d", ans[i][j]);
    }
    puts("");
  }
}
void rev() {
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= N; j++) {
      if (i % 2 != j % 2) {
        ans[i][j] ^= 1;
      }
    }
  }
}
void check(int X1, int Y1, int X2, int Y2) {
  if (query(X1, Y1, X2, Y2) != (ans[X1][Y1] == ans[X2][Y2])) rev();
}
int main() {
  scanf("%d", &N);
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= N; j++) {
      ans[i][j] = -1;
    }
  }
  ans[1][1] = 1;
  ans[N][N] = 0;
  gao(1, 1, 2, 2);
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= N; j++) {
      if (ans[i][j] != -1) continue;
      if (i % 2 != j % 2) continue;
      if (j - 2 > 0) {
        gao(i, j - 2, i, j);
      } else {
        gao(i - 2, j, i, j);
      }
    }
  }
  ans[1][2] = 1;
  gao(1, 2, 2, 3);
  ans[2][1] = ans[2][3] ^ (!query(2, 1, 2, 3));
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= N; j++) {
      if (ans[i][j] != -1) continue;
      if (i % 2 == j % 2) continue;
      if (j - 2 > 0) {
        gao(i, j - 2, i, j);
      } else {
        gao(i - 2, j, i, j);
      }
    }
  }
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= N; j++) {
      if (i % 2 == j % 2 && i - 1 > 0 && j + 1 <= N &&
          ans[i][j] != ans[i - 1][j + 1]) {
        if (j + 2 <= N) {
          check(i - 1, j, i, j + 2);
        } else {
          check(i - 1, j, i + 1, j + 1);
        }
        print();
        return 0;
      }
    }
  }
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= N; j++) {
      if (i % 2 != j % 2 && i - 1 > 0 && j + 1 <= N &&
          ans[i][j] != ans[i - 1][j + 1]) {
        if (i - 2 > 0) {
          check(i - 2, j, i, j + 1);
        } else if (j - 1 > 0) {
          check(i - 1, j - 1, i, j + 1);
        } else {
          assert(i == 2 && j == 1);
          check(1, 1, 2, 3);
        }
        print();
        return 0;
      }
    }
  }
  int v[110], v2[110];
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= N; j++) {
      v[i + j] = ans[i][j];
      v2[i + j] = v[i + j];
    }
  }
  for (int i = 3; i <= 2 * N + 3; i += 2) {
    v2[i] ^= 1;
  }
  bool pa;
  int sp;
  for (int i = 2; i <= 2 * N - 3; i++) {
    if ((v[i] == v[i + 3] && v[i + 1] == v[i + 2]) !=
        (v2[i] == v2[i + 3] && v2[i + 1] == v2[i + 2])) {
      pa = (v[i] == v[i + 3] && v[i + 1] == v[i + 2]);
      sp = i;
      break;
    }
  }
  int nx, ny;
  if (sp <= N + 1) {
    nx = sp - 1;
    ny = 1;
  } else {
    nx = N;
    ny = sp - N;
  }
  if (query(nx, ny, nx, ny + 3) != pa) {
    rev();
  }
  print();
}
