#include <bits/stdc++.h>
using namespace std;
bool v[55][55];
int n;
int a[55][55];
int cnt = 3;
void set_it(pair<int, int> p1, pair<int, int> p2, int e) {
  if (!v[p1.first][p1.second]) swap(p1, p2);
  if (!v[p1.first][p1.second] || v[p2.first][p2.second]) return;
  v[p2.first][p2.second] = true;
  cnt++;
  if (e)
    a[p2.first][p2.second] = a[p1.first][p1.second];
  else
    a[p2.first][p2.second] = !a[p1.first][p1.second];
}
int ask(pair<int, int> p1, pair<int, int> p2) {
  if (p1.first > p2.first || p1.second > p2.second) swap(p1, p2);
  cout << "? ";
  cout << p1.first << " " << p1.second << " " << p2.first << " " << p2.second
       << endl;
  cout.flush();
  int ans;
  cin >> ans;
  return ans;
}
pair<int, int> find(pair<int, int> p) {
  int m[6][2] = {{2, 0}, {0, 2}, {-2, 0}, {0, -2}, {1, 1}, {-1, -1}};
  for (int i = 0; i < 6; i++) {
    pair<int, int> p2 = make_pair(p.first + m[i][0], p.second + m[i][1]);
    if (p2.first < 1 || p2.first > n || p2.second < 1 || p2.second > n)
      continue;
    if (!v[p2.first][p2.second] && !v[p.first][p.second]) continue;
    return p2;
  }
  return make_pair(-1, -1);
}
vector<string> vs;
pair<int, int> f, f2;
bool flip = false;
bool dfs(pair<int, int> c, int m, string s) {
  if (m < 0) return false;
  if (m == 0 && (c.first != f2.first || c.second != f2.second)) return false;
  int val = a[c.first][c.second];
  if (flip && (c.first + c.second) % 2 == 1) val = !val;
  s += (char)(val + '0');
  if (m == 0) {
    for (int i = 0; i < s.size() / 2; i++) {
      if (s[i] != s[s.size() - 1 - i]) return false;
    }
    return true;
  }
  bool ans = dfs(make_pair(c.first + 1, c.second), m - 1, s);
  ans = ans || dfs(make_pair(c.first, c.second + 1), m - 1, s);
  return ans;
}
bool check(pair<int, int> c, pair<int, int> d) {
  if (c.first < 1 || c.first > n || d.first < 1 || d.first > n) return false;
  if (c.second < 1 || c.second > n || d.second < 1 || d.second > n)
    return false;
  flip = true;
  f = c;
  f2 = d;
  int ans1 = dfs(f, 3, "");
  flip = false;
  int ans2 = dfs(f, 3, "");
  return ans1 != ans2;
}
int main() {
  cin >> n;
  v[1][1] = true;
  v[n][n] = true;
  v[2][1] = true;
  a[2][1] = 1;
  a[1][1] = 1;
  a[n][n] = 0;
  while (cnt < n * n) {
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) {
        if (v[i][j]) continue;
        pair<int, int> c = make_pair(i, j);
        pair<int, int> s = find(c);
        if (s.first == -1) continue;
        int ans = ask(c, s);
        set_it(c, s, ans);
      }
    }
  }
  bool f_all = false;
  bool bit = false;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      pair<int, int> px1 = make_pair(i, j);
      pair<int, int> px2 = make_pair(i + 1, j + 2);
      pair<int, int> px3 = make_pair(i + 2, j + 1);
      if (check(px1, px2)) {
        f = px1;
        f2 = px2;
        bit = true;
        break;
      }
    }
    if (bit) break;
  }
  int b = 0, b2 = 0;
  if (bit) {
    b = dfs(f, 3, "");
    b2 = ask(f, f2);
  }
  if (b != b2) {
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) {
        if ((i + j) % 2 == 0) continue;
        a[i][j] = !a[i][j];
      }
    }
  }
  cout << "!" << endl;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      cout << a[i][j];
    }
    cout << endl;
  }
  return 0;
}
