#include <bits/stdc++.h>
using namespace std;
const int maxn = 53;
int a[maxn][maxn], n, dp[2][maxn][maxn][maxn][maxn];
struct T {
  int x, y, step;
  T() {}
  T(int _x, int _y, int _s) : x(_x), y(_y), step(_s) {}
};
struct QQ {
  int sx, sy, x, y;
  QQ() {}
  QQ(int _sx, int _sy, int _x, int _y) : sx(_sx), sy(_sy), x(_x), y(_y) {}
};
vector<QQ> v[maxn * 2];
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);
  if (ret == -1) exit(0);
  return ret;
}
int main() {
  scanf("%d", &n);
  a[1][1] = 1;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if ((i == 1 && j <= 2) || (i == 2 && j == 1) || (i == n && j == n))
        continue;
      int ii, jj;
      if (i == 1)
        ii = i, jj = j - 2;
      else if (i > 2 && j == 1)
        ii = i - 2, jj = j;
      else
        ii = i - 1, jj = j - 1;
      a[i][j] = a[ii][jj] ^ query(ii, jj, i, j) ^ 1;
      if (i == 2 && j == 3) a[2][1] = a[2][3] ^ query(2, 1, 2, 3) ^ 1;
    }
  }
  for (int sx = 1; sx <= n; sx++) {
    for (int sy = 1; sy <= n; sy++) {
      for (int x = sx; x <= n; x++) {
        for (int y = sy; y <= n; y++) {
          v[abs(sx - x) + abs(sy - y)].push_back(QQ(sx, sy, x, y));
        }
      }
    }
  }
  for (int b = 0; b <= 1; b++) {
    for (int i = 0; i <= n * 2 - 2; i++) {
      for (int j = 0; j < int(v[i].size()); j++) {
        int sx = v[i][j].sx, sy = v[i][j].sy, x = v[i][j].x, y = v[i][j].y;
        if (sx == x && sy == y)
          dp[b][sx][sy][x][y] = 1;
        else if (x - sx + y - sy == 1)
          dp[b][sx][sy][x][y] = (a[sx][sy] == a[x][y]);
        else {
          if (a[sx][sy] == a[x][y]) {
            if (sx + 2 <= x) dp[b][sx][sy][x][y] |= dp[b][sx + 1][sy][x - 1][y];
            if (sx + 1 <= x && sy + 1 <= y) {
              dp[b][sx][sy][x][y] |= dp[b][sx + 1][sy][x][y - 1];
              dp[b][sx][sy][x][y] |= dp[b][sx][sy + 1][x - 1][y];
            }
            if (sy + 2 <= y) dp[b][sx][sy][x][y] |= dp[b][sx][sy + 1][x][y - 1];
          }
        }
      }
    }
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++)
        if ((i + j) & 1) a[i][j] ^= 1;
  }
  int flag = -1;
  for (int sx = 1; sx <= n; sx++) {
    for (int sy = 1; sy <= n; sy++) {
      for (int x = sx; x <= n; x++) {
        for (int y = sy; y <= n; y++) {
          if (abs(sx - x) + abs(sy - y) >= 2 &&
              dp[0][sx][sy][x][y] != dp[1][sx][sy][x][y]) {
            flag = (query(sx, sy, x, y) == dp[1][sx][sy][x][y]);
            break;
          }
        }
        if (~flag) break;
      }
      if (~flag) break;
    }
    if (~flag) break;
  }
  puts("!");
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if ((i + j) & 1) a[i][j] ^= flag;
      printf("%d", a[i][j]);
    }
    puts("");
  }
  return 0;
}
