#include <bits/stdc++.h>
using namespace std;
const int N = 55;
int n, is[N][N];
bool que(int gtmsub, int gtmshb, int gtmjtjl, int gtmsf) {
  printf("? %d %d %d %d\n", gtmsub, gtmshb, gtmjtjl, gtmsf);
  fflush(stdout);
  int ret;
  scanf("%d", &ret);
  return ret;
}
void tem() {
  puts("!");
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) printf("%d", is[i][j] == 1 ? 1 : 0);
    puts("");
  }
  fflush(stdout);
  exit(0);
}
bool check() {
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= n; ++j)
      if (i + 1 <= n && j - 1 >= 1 && is[i][j] != is[i + 1][j - 1]) {
        if (j + 1 <= n)
          return que(i, j - 1, i + 1, j + 1) ^
                 (is[i][j - 1] * is[i + 1][j + 1] < 0);
        else
          return que(i, j - 2, i + 1, j) ^ (is[i][j - 2] * is[i + 1][j] < 0);
      }
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= n; ++j)
      if (i + 2 <= n && j + 2 <= n && is[i][j] == 1 && is[i + 2][j + 2] == -1) {
        bool p0 = que(i, j, i + 2, j + 1), p1 = que(i + 1, j, i + 2, j + 2);
        if (is[i + 1][j] == is[i + 2][j + 1]) {
          if (p0 || p1)
            return is[i + 1][j] * is[i + 2][j] > 0;
          else
            return is[i + 1][j] * is[i + 2][j] < 0;
        } else {
          if (p0 || p1)
            return is[i][j] * is[i + 2][j + 1] > 0;
          else
            return is[i][j] * is[i + 2][j + 1] < 0;
        }
      }
  assert(0);
}
int main() {
  scanf("%d", &n);
  is[1][1] = 1;
  is[n][n] = -1;
  is[1][2] = 2;
  if (que(1, 2, 2, 3))
    is[2][3] = 2;
  else
    is[2][3] = -2;
  if (que(2, 1, 2, 3))
    is[2][1] = is[2][3];
  else
    is[2][1] = -is[2][3];
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= n; ++j)
      if (is[i][j] == 0) {
        if (i - 2 >= 1 && is[i - 2][j] != 0)
          is[i][j] = (que(i - 2, j, i, j) ? 1 : -1) * is[i - 2][j];
        else if (j - 2 >= 1 && is[i][j - 2] != 0)
          is[i][j] = (que(i, j - 2, i, j) ? 1 : -1) * is[i][j - 2];
        else if (i - 1 >= 1 && j - 1 >= 1 && is[i - 1][j - 1] != 0)
          is[i][j] = (que(i - 1, j - 1, i, j) ? 1 : -1) * is[i - 1][j - 1];
      }
  int typ = check();
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= n; ++j)
      if (abs(is[i][j]) == 2) {
        if (typ)
          is[i][j] /= 2;
        else
          is[i][j] = -is[i][j] / 2;
      }
  tem();
}
