#include <bits/stdc++.h>
using namespace std;
int n;
int val[55][55];
int query(int x1, int y1, int x2, int y2) {
  printf("? %d %d %d %d\n", x1, y1, x2, y2);
  fflush(stdout);
  int a;
  scanf("%d", &a);
  return a;
}
void rec(int x, int y) {
  if (val[x][y] != -1) return;
  int a, b;
  if (x == 1)
    a = x, b = y - 2;
  else if (y == 1)
    a = x - 2, b = y;
  else
    a = x - 1, b = y - 1;
  rec(a, b);
  int ai = query(a, b, x, y);
  if (ai)
    val[x][y] = val[a][b];
  else
    val[x][y] = !val[a][b];
}
int val2[55][55];
int fx[] = {1, 0};
int fy[] = {0, 1};
int dp[55][55][55][55];
int dp2[55][55][55][55];
bool ispali2(int i, int j, int k, int l) {
  if (i > k || j > l) return 0;
  if (i == k) {
    int f = 0;
    for (int m = 0; m < l - j + 1; m++) {
      if (val2[i][j + m] != val2[i][l - m]) {
        f = 1;
        break;
      }
    }
    return !f;
  }
  if (j == l) {
    int f = 0;
    for (int m = 0; m < k - i + 1; m++)
      if (val2[i + m][j] != val2[k - m][j]) {
        f = 1;
        break;
      }
    return !f;
  }
  int &ret = dp2[i][j][k][l];
  if (ret != -1) return ret;
  if (val2[i][j] != val2[k][l]) return ret = 0;
  ret = 0;
  for (int x = 0; x < 2; x++) {
    for (int y = 0; y < 2; y++) {
      ret |= ispali2(i + fx[x], j + fy[x], k - fx[y], l - fy[y]);
    }
  }
  return ret;
}
bool ispali1(int i, int j, int k, int l) {
  if (i > k || j > l) return 0;
  if (i == k) {
    int f = 0;
    for (int m = 0; m < l - j + 1; m++) {
      if (val[i][j + m] != val[i][l - m]) {
        f = 1;
        break;
      }
    }
    return !f;
  }
  if (j == l) {
    int f = 0;
    for (int m = 0; m < k - i + 1; m++)
      if (val[i + m][j] != val[k - m][j]) {
        f = 1;
        break;
      }
    return !f;
  }
  int &ret = dp[i][j][k][l];
  if (ret != -1) return ret;
  if (val[i][j] != val[k][l]) return ret = 0;
  ret = 0;
  for (int x = 0; x < 2; x++) {
    for (int y = 0; y < 2; y++) {
      ret |= ispali1(i + fx[x], j + fy[x], k - fx[y], l - fy[y]);
    }
  }
  return ret;
}
int main() {
  scanf("%d", &n);
  memset(val, -1, sizeof val);
  memset(dp, -1, sizeof dp);
  memset(dp2, -1, sizeof dp2);
  val[1][1] = 1;
  val[n][n] = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if ((i + j) % 2 == 0) rec(i, j);
    }
  }
  val[1][2] = 1;
  val[2][3] = (!query(1, 2, 2, 3)) ^ val[1][2];
  val[2][1] = (!query(2, 1, 2, 3)) ^ val[2][3];
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if ((i + j) % 2 == 1) rec(i, j);
    }
  }
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) {
      val2[i][j] = val[i][j];
      if ((i + j) & 1) val2[i][j] ^= 1;
    }
  int ans = 1;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      for (int k = i; k <= n; k++) {
        for (int l = j; l <= n; l++) {
          if (i == k && j == l) continue;
          if (i + j + 2 > k + l) continue;
          if (ispali1(i, j, k, l) != ispali2(i, j, k, l)) {
            if (query(i, j, k, l) == ispali1(i, j, k, l)) ans = 0;
            goto fin;
          }
        }
      }
    }
  }
fin:
  printf("!\n");
  if (ans) {
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) printf("%d", val2[i][j]);
      printf("\n");
    }
  } else {
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) printf("%d", val[i][j]);
      printf("\n");
    }
  }
  return 0;
}
