#include <bits/stdc++.h>
using namespace std;
const int maxn = 50 + 10;
int a[maxn][maxn];
int dx[10] = {0, 2, 1, 0, -1, -2};
int dy[10] = {2, 0, 1, -2, -1, 0};
int sx, sy;
struct Node {
  int x, y;
};
int main() {
  int n;
  scanf("%d", &n);
  memset(a, -1, sizeof(a));
  a[1][1] = 1;
  a[n][n] = 0;
  queue<Node> q;
  q.push((Node){1, 1});
  while (!q.empty()) {
    Node tmp = q.front();
    q.pop();
    int x = tmp.x, y = tmp.y;
    for (int i = 0; i < 3; i++) {
      int tx = x + dx[i], ty = y + dy[i];
      if (tx < 1 || ty < 1 || tx > n || ty > n) continue;
      if (a[tx][ty] != -1) continue;
      cout << '?' << ' ' << x << ' ' << y << ' ' << tx << ' ' << ty << '\n';
      cout.flush();
      int t;
      cin >> t;
      a[tx][ty] = t ? a[x][y] : a[x][y] ^ 1;
      q.push((Node){tx, ty});
    }
  }
  for (int i = 1; i <= n; i++) {
    if (i + 2 > n) break;
    for (int j = 1; j <= n; j++) {
      if (j + 2 > n) break;
      if (a[i][j] == 1 && a[i + 2][j + 2] == 0) {
        sx = i, sy = j;
        break;
      }
    }
  }
  int tmp;
  cout << '?' << ' ' << sx << ' ' << sy + 1 << ' ' << sx + 1 << ' ' << sy + 2
       << '\n';
  cout.flush();
  cin >> tmp;
  if (tmp) {
    cout << '?' << ' ' << sx << ' ' << sy << ' ' << sx + 1 << ' ' << sy + 2
         << '\n';
    cout.flush();
    cin >> tmp;
    if (tmp) {
      a[sx][sy + 1] = a[sx + 1][sy + 2] = 1;
    } else {
      if (a[sx][sy + 2] == 1) {
        a[sx][sy + 1] = a[sx + 1][sy + 2] = 0;
      } else {
        cout << '?' << ' ' << sx << ' ' << sy + 1 << ' ' << sx + 2 << ' '
             << sy + 2 << '\n';
        cout.flush();
        cin >> tmp;
        if (tmp) {
          a[sx][sy + 1] = a[sx + 1][sy + 2] = 0;
        } else {
          a[sx][sy + 1] = a[sx + 1][sy + 2] = 1;
        }
      }
    }
  } else {
    cout << '?' << ' ' << sx << ' ' << sy << ' ' << sx + 1 << ' ' << sy + 2
         << '\n';
    cout.flush();
    cin >> tmp;
    if (tmp) {
      a[sx][sy + 1] = 0;
      a[sx + 1][sy + 2] = 1;
    } else {
      cout << '?' << ' ' << sx << ' ' << sy + 1 << ' ' << sx + 2 << ' '
           << sy + 2 << '\n';
      cout.flush();
      cin >> tmp;
      if (tmp) {
        a[sx][sy + 1] = 0;
        a[sx + 1][sy + 2] = 1;
      } else {
        a[sx][sy + 1] = 1;
        a[sx + 1][sy + 2] = 0;
      }
    }
  }
  q.push((Node){sx, sy + 1});
  while (!q.empty()) {
    Node tmp = q.front();
    q.pop();
    int x = tmp.x, y = tmp.y;
    for (int i = 0; i < 6; i++) {
      int tx = x + dx[i], ty = y + dy[i];
      if (tx < 1 || ty < 1 || tx > n || ty > n) continue;
      if (a[tx][ty] != -1) continue;
      if (i < 3)
        cout << '?' << ' ' << x << ' ' << y << ' ' << tx << ' ' << ty << '\n';
      else
        cout << '?' << ' ' << tx << ' ' << ty << ' ' << x << ' ' << y << '\n';
      cout.flush();
      int t;
      cin >> t;
      a[tx][ty] = t ? a[x][y] : a[x][y] ^ 1;
      q.push((Node){tx, ty});
    }
  }
  cout << '!' << '\n';
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      cout << a[i][j];
    }
    cout << '\n';
  }
  cout << '\n';
  return 0;
}
