#include <bits/stdc++.h>
using namespace std;
const int inf = 2147483647;
const int dx[4] = {0, 1, 0, -1};
const int dy[4] = {1, 0, -1, 0};
int _max(int x, int y) { return x > y ? x : y; }
int _min(int x, int y) { return x < y ? x : y; }
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9')
    x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
  return x * f;
}
void put(int x) {
  if (x < 0) putchar('-'), x = -x;
  if (x >= 10) put(x / 10);
  putchar(x % 10 + '0');
}
int mp[51][51];
int main() {
  int n = read();
  mp[1][1] = 1, mp[n][n] = 0;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) {
      if (!((i + j) & 1)) {
        if (i == 1 && j == 1) continue;
        if (i == n && j == n) continue;
        int x = i, y = j;
        if (x > 2)
          x -= 2;
        else if (y > 2)
          y -= 2;
        else
          x -= 1, y -= 1;
        printf("? %d %d %d %d\n", x, y, i, j);
        fflush(stdout);
        int o = read() ^ 1;
        mp[i][j] = mp[x][y] ^ o;
      }
    }
  printf("? %d %d %d %d\n", 1, 2, 3, 2);
  fflush(stdout);
  int o = read() ^ 1;
  mp[1][2] = 0, mp[3][2] = o;
  printf("? %d %d %d %d\n", 2, 1, 3, 2);
  fflush(stdout);
  o = read() ^ 1;
  mp[2][1] = mp[3][2] ^ o;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) {
      if (!((i + j) & 1)) continue;
      if (i == 1 && j == 2) continue;
      if (i == 3 && j == 2) continue;
      if (i == 2 && j == 1) continue;
      int x = i, y = j;
      if (x > 2)
        x -= 2;
      else if (y > 2)
        y -= 2;
      else
        x -= 1, y -= 1;
      printf("? %d %d %d %d\n", x, y, i, j);
      fflush(stdout);
      int o = read() ^ 1;
      mp[i][j] = mp[x][y] ^ o;
    }
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) {
      if ((i + j) & 1) {
        for (int zz = 0; zz < 2; zz++) {
          int ax = i, ay = j;
          int bx = i, by = j;
          if (zz == 0 && (i <= 1 || i >= n))
            continue;
          else if (zz == 0)
            ax--, bx++;
          if (zz == 1 && (j <= 1 || j >= n))
            continue;
          else if (zz == 1)
            ay--, by++;
          int uu = mp[ax][ay] ^ mp[bx][by];
          for (int k = 2; k < 4; k++) {
            int nx = ax + dx[k], ny = ay + dy[k];
            if (nx >= 1 && nx <= n && ny >= 1 && ny <= n) {
              if ((mp[i][j] ^ mp[nx][ny]) == uu) {
                printf("? %d %d %d %d\n", nx, ny, bx, by);
                fflush(stdout);
                int o = read(), c = mp[i][j] ^ mp[ax][ay];
                c ^= (o ^ 1);
                puts("!");
                for (int i = 1; i <= n; i++) {
                  for (int j = 1; j <= n; j++) {
                    if ((i + j) & 1) mp[i][j] ^= c;
                    put(mp[i][j]);
                  }
                  puts("");
                }
                fflush(stdout);
                return 0;
              }
            }
          }
          for (int k = 0; k < 2; k++) {
            int nx = bx + dx[k], ny = by + dy[k];
            if (nx >= 1 && nx <= n && ny >= 1 && ny <= n) {
              if ((mp[i][j] ^ mp[nx][ny]) == uu) {
                printf("? %d %d %d %d\n", ax, ay, nx, ny);
                fflush(stdout);
                int o = read(), c = mp[i][j] ^ mp[bx][by];
                c ^= (o ^ 1);
                puts("!");
                for (int i = 1; i <= n; i++) {
                  for (int j = 1; j <= n; j++) {
                    if ((i + j) & 1) mp[i][j] ^= c;
                    put(mp[i][j]);
                  }
                  puts("");
                }
                fflush(stdout);
                return 0;
              }
            }
          }
        }
      }
    }
  return 0;
}
