#include <bits/stdc++.h>
using namespace std;
const int maxN = 60;
vector<int> dy = {2, 1, 0};
vector<int> dx = {0, 1, 2};
int tabla[maxN][maxN];
int query(int y1, int x1, int y2, int x2) {
  int ans;
  cout << "? " << y1 + 1 << " " << x1 + 1 << " " << y2 + 1 << " " << x2 + 1
       << endl;
  cin >> ans;
  return ans;
}
int main() {
  int n, y, x, k, invertir = -1, i, j, l;
  cin >> n;
  tabla[0][0] = 1;
  tabla[n - 1][n - 1] = 0;
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      if (!(i == n - 1 && j == n - 1)) {
        if ((i + j) % 2 == 0) {
          for (l = 0; l < dx.size(); l++) {
            y = i - dy[l];
            x = j - dx[l];
            if (y >= 0 && x >= 0) {
              k = query(y, x, i, j);
              tabla[i][j] = (tabla[y][x] + k + 1) % 2;
              break;
            }
          }
        }
      }
    }
  }
  tabla[0][1] = 0;
  k = query(0, 1, 1, 2);
  tabla[1][2] = (tabla[0][1] + k + 1) % 2;
  k = query(0, 1, 2, 1);
  tabla[2][1] = (tabla[0][1] + k + 1) % 2;
  k = query(1, 0, 2, 1);
  tabla[1][0] = (tabla[2][1] + k + 1) % 2;
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      if (!(i <= 2 && j <= 2)) {
        if ((i + j) % 2 == 1) {
          for (l = 0; l < dx.size(); l++) {
            y = i - dy[l];
            x = j - dx[l];
            if (y >= 0 && x >= 0) {
              k = query(y, x, i, j);
              tabla[i][j] = (tabla[y][x] + k + 1) % 2;
              break;
            }
          }
        }
      }
    }
  }
  for (l = 0; l < n - 3; l++) {
    if (tabla[l][0] == tabla[l + 3][0] && tabla[l + 1][0] == tabla[l + 2][0]) {
      k = query(l, 0, l + 3, 0);
      if (k == 0)
        invertir = 1;
      else
        invertir = 0;
      break;
    } else if (tabla[l][0] == ((tabla[l + 3][0] + 1) % 2) &&
               ((tabla[l + 1][0] + 1) % 2) == tabla[l + 2][0]) {
      k = query(l, 0, l + 3, 0);
      if (k == 1)
        invertir = 1;
      else
        invertir = 0;
      break;
    }
  }
  if (invertir == -1) {
    for (l = 0; l < n - 3; l++) {
      if (tabla[n - 1][l] == tabla[n - 1][l + 3] &&
          tabla[n - 1][l + 1] == tabla[n - 1][l + 2]) {
        k = query(n - 1, l, n - 1, l + 3);
        if (k == 0)
          invertir = 1;
        else
          invertir = 0;
        break;
      } else if (tabla[n - 1][l] == ((tabla[n - 1][l + 3] + 1) % 2) &&
                 ((tabla[n - 1][l + 1] + 1) % 2) == tabla[n - 1][l + 2]) {
        k = query(n - 1, l, n - 1, l + 3);
        if (k == 1)
          invertir = 1;
        else
          invertir = 0;
        break;
      }
    }
  }
  if (invertir == -1) {
    if (tabla[n - 3][0] == tabla[n - 1][1] &&
        tabla[n - 2][0] == tabla[n - 1][0]) {
      k = query(n - 3, 0, n - 1, 1);
      if (k == 0)
        invertir = 1;
      else
        invertir = 0;
    } else if (tabla[n - 3][0] == ((tabla[n - 1][1] + 1) % 2) &&
               ((tabla[n - 2][0] + 1) % 2) == tabla[n - 1][0]) {
      k = query(n - 3, 0, n - 1, 1);
      if (k == 1)
        invertir = 1;
      else
        invertir = 0;
    }
    if (invertir == -1) {
      if (tabla[n - 2][0] == tabla[n - 1][2] &&
          tabla[n - 1][0] == tabla[n - 1][1]) {
        k = query(n - 2, 0, n - 1, 2);
        if (k == 0)
          invertir = 1;
        else
          invertir = 0;
      }
      if (tabla[n - 2][0] == ((tabla[n - 1][2] + 1) % 2) &&
          ((tabla[n - 1][0] + 1) % 2) == tabla[n - 1][1]) {
        k = query(n - 2, 0, n - 1, 2);
        if (k == 1)
          invertir = 1;
        else
          invertir = 0;
      }
    }
  }
  if (invertir == 1) {
    for (i = 0; i < n; i++) {
      for (j = 0; j < n; j++) {
        if ((i + j) % 2 == 1) tabla[i][j] = (tabla[i][j] + 1) % 2;
      }
    }
  }
  cout << "!" << endl;
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      cout << tabla[i][j];
    }
    cout << endl;
  }
}
