#include <bits/stdc++.h>
using namespace std;
struct InputReader {
  char buf[1048576];
  int p;
  inline InputReader() { p = 1048576; }
  inline void Flush() {
    p = 0;
    fread(buf, 1, 1048576, stdin);
  }
  inline char C() {
    if (p >= 1048576) Flush();
    return buf[p++];
  }
  inline char Readnum() {
    char ch = C();
    while (!isdigit(ch) && ch != '-') ch = C();
    return ch;
  }
  inline void Readalpha(char &c) {
    c = C();
    while (!isalpha(c)) c = C();
  }
  int operator()() {
    int ans = 0, fu = 1;
    char ch = Readnum();
    if (ch == '-') fu = -1, ch = C();
    while (ch >= '0' && ch <= '9') {
      ans = ans * 10 + ch - '0';
      ch = C();
    }
    return ans * fu;
  }
  long long Readll() {
    long long ans = 0LL, fu = 1LL;
    char ch = Readnum();
    if (ch == '-') fu = -1LL, ch = C();
    while (ch >= '0' && ch <= '9') {
      ans = ans * 10LL + ch - '0';
      ch = C();
    }
    return ans * fu;
  }
  inline void Readstring(string &x) {
    x.clear();
    char ch = C();
    while (!isdigit(ch) && !isalpha(ch) && ch != '#' && ch != '.') ch = C();
    while (isdigit(ch) || isalpha(ch) || ch == '#' || ch == '.') {
      x += ch;
      ch = C();
    }
  }
  inline void Readchstring(char s[]) {
    int len = 0;
    char ch = C();
    while (!isdigit(ch) && !isalpha(ch)) ch = C();
    while (isdigit(ch) || isalpha(ch)) {
      s[len++] = ch;
      ch = C();
    }
    s[len] = '\0';
  }
  inline void Specialread(char &c) {
    c = C();
    while (!isdigit(c) && !isalpha(c) && c != '#' && c != '.' && c != '=' &&
           c != 'B')
      c = C();
  }
} In;
inline void Read(int &x) { x = In(); }
inline void Read(int &x, int &y) {
  x = In();
  y = In();
}
inline void Read(int &x1, int &x2, int &x3) {
  x1 = In();
  x2 = In();
  x3 = In();
}
inline void Read(int &x1, int &x2, int &x3, int &x4) {
  x1 = In();
  x2 = In();
  x3 = In();
  x4 = In();
}
inline void Read(long long &x) { x = In.Readll(); }
inline void Read(long long &x, long long &y) {
  x = In.Readll();
  y = In.Readll();
}
inline void Read(long long &x1, long long &x2, long long &x3) {
  x1 = In.Readll();
  x2 = In.Readll();
  x3 = In.Readll();
}
inline void Read(long long &x1, long long &x2, long long &x3, long long &x4) {
  x1 = In.Readll();
  x2 = In.Readll();
  x3 = In.Readll();
  x4 = In.Readll();
}
template <typename T>
void Read(T a[], int st, int ed) {
  for (int(i) = (st); (i) <= (ed); ++(i)) Read(a[i]);
}
inline void FILEIO() {}
inline void FILEIO(string pname) {
  freopen((pname + ".in").c_str(), "r", stdin);
  freopen((pname + ".out").c_str(), "w", stdout);
}
inline void FILEIO_OICONTEST(string pname) {
  freopen((pname + ".in").c_str(), "r", stdin);
  freopen((pname + ".out").c_str(), "w", stdout);
}
void Printtime() {}
void END() {
  Printtime();
  exit(0);
}
template <typename T>
void END(T mes) {
  cout << mes << endl;
  END();
}
template <typename T>
void Print(T a[], int s, int t, char sp = ' ', char ed = '\n') {
  if (s > t) return;
  for (int i = s; i < t; i++) cout << a[i] << sp;
  cout << a[t] << ed;
  cout.flush();
}
template <typename T>
void Print(T a, int s = 0, int t = -1, char sp = ' ', char ed = '\n') {
  if (t == -1) t = a.size() - 1;
  for (int i = s; i <= t; i++) cout << a[i] << sp;
  cout << ed;
  cout.flush();
}
vector<int> Range(int l, int r) {
  vector<int> ret{};
  for (int(i) = (l); (i) <= (r); ++(i)) ret.push_back(i);
  return ret;
}
mt19937 Rand(0xe38195e38293);
const int MAXN = 64;
const int MAXD = 8192;
bool Ask(int x1, int y1, int x2, int y2) {
  cout << "? " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
  fflush(stdout);
  int res;
  cin >> res;
  if (res == -1)
    while (1)
      ;
  return res;
}
int n;
int id[MAXN][MAXN][2];
int dsu[MAXD];
void Init() {
  for (int(i) = 0; (i) < (MAXD); ++(i)) dsu[i] = i;
}
int Findfa(int pos) {
  return dsu[pos] == pos ? pos : dsu[pos] = Findfa(dsu[pos]);
}
inline bool Unite(int a, int b) {
  a = Findfa(a);
  b = Findfa(b);
  if (a == b) return 0;
  dsu[a] = b;
  return 1;
}
bool IsNumDiff(int x1, int y1, int x2, int y2) {
  return Findfa(id[x1][y1][0]) != Findfa(id[x2][y2][0]);
}
int ansl[MAXD];
void SaveMe(int p) {
  bool s1 = Ask(p, p, p + 2, p + 1);
  bool s2 = Ask(p + 1, p, p + 2, p + 2);
  if (s1) {
    Unite(id[p][p][0], id[p + 2][p + 1][0]);
    Unite(id[p][p][1], id[p + 2][p + 1][1]);
    return;
  }
  if (s2) {
    Unite(id[p + 1][p][0], id[p + 2][p + 2][0]);
    Unite(id[p + 1][p][1], id[p + 2][p + 2][1]);
    return;
  }
  if (!IsNumDiff(p, p, p + 1, p + 1)) {
    Unite(id[p][p][0], id[p + 2][p + 1][1]);
    Unite(id[p][p][1], id[p + 2][p + 1][0]);
  } else {
    Unite(id[p][p][0], id[p + 1][p][0]);
    Unite(id[p][p][1], id[p + 1][p][1]);
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  memset(ansl, -1, sizeof(ansl));
  cin >> n;
  int uid = 0;
  for (int(i) = 1; (i) <= (n); ++(i))
    for (int(j) = 1; (j) <= (n); ++(j)) {
      id[i][j][0] = ++uid;
      id[i][j][1] = ++uid;
    }
  Init();
  Unite(id[1][1][0], id[n][n][1]);
  Unite(id[1][1][1], id[n][n][0]);
  for (int(i) = 1; (i) <= (n - 1); ++(i))
    for (int(j) = 1; (j) <= (n - 1); ++(j)) {
      if (i == n - 1 and j == n - 1) continue;
      bool same = Ask(i, j, i + 1, j + 1);
      if (same) {
        Unite(id[i][j][0], id[i + 1][j + 1][0]);
        Unite(id[i][j][1], id[i + 1][j + 1][1]);
      } else {
        Unite(id[i][j][0], id[i + 1][j + 1][1]);
        Unite(id[i][j][1], id[i + 1][j + 1][0]);
      }
    }
  for (int(i) = (1); (i) <= (n - 2); (i) += (1)) {
    bool same = Ask(i, 1, i + 2, 1);
    if (same) {
      Unite(id[i][1][0], id[i + 2][1][0]);
      Unite(id[i][1][1], id[i + 2][1][1]);
    } else {
      Unite(id[i][1][0], id[i + 2][1][1]);
      Unite(id[i][1][1], id[i + 2][1][0]);
    }
  }
  for (int(j) = (1); (j) <= (n - 2); (j) += (1)) {
    bool same = Ask(1, j, 1, j + 2);
    if (same) {
      Unite(id[1][j][0], id[1][j + 2][0]);
      Unite(id[1][j][1], id[1][j + 2][1]);
    } else {
      Unite(id[1][j][0], id[1][j + 2][1]);
      Unite(id[1][j][1], id[1][j + 2][0]);
    }
  }
  {
    bool same = Ask(1, 2, 3, 2);
    if (same) {
      Unite(id[1][2][0], id[3][2][0]);
      Unite(id[1][2][1], id[3][2][1]);
    } else {
      Unite(id[1][2][0], id[3][2][1]);
      Unite(id[1][2][1], id[3][2][0]);
    }
  }
  for (int(i) = 1; (i) <= (n); ++(i)) {
    if (!IsNumDiff(1, 1, i, i)) {
      int j = i + 2;
      if (j == n or IsNumDiff(1, 1, j, j)) {
        SaveMe(i);
        break;
      }
    }
  }
  cout << "!" << endl;
  int god = Findfa(id[1][1][1]);
  for (int(i) = 1; (i) <= (n); ++(i)) {
    for (int(j) = 1; (j) <= (n); ++(j)) {
      int fa0 = Findfa(id[i][j][0]);
      int fa1 = Findfa(id[i][j][1]);
      if (fa0 == god or (i == n && j == n))
        cout << "0";
      else if (fa1 == god)
        cout << "1";
      else
        assert(0);
    }
    cout << endl;
  }
  END();
}
