#include <bits/stdc++.h>
using namespace std;
int n;
int a[100][100], b[100][100];
int vis[100][100];
struct node {
  int x, y, z;
};
const int dx1[] = {0, 2, 1, 0, 0};
const int dy1[] = {0, 0, 1, 2, -2};
void bfs() {
  queue<node> q;
  q.push({1, 1, 1});
  vis[1][1] = 1;
  a[1][1] = 1;
  b[1][1] = 1;
  vis[n][n] = 0;
  a[n][n] = 0;
  b[n][n] = 0;
  int ans;
  while (!q.empty()) {
    node p = q.front();
    q.pop();
    int x = p.x, y = p.y, z = p.z;
    for (int i = 1; i <= 4; i++) {
      int xx = x + dx1[i], yy = y + dy1[i];
      if (xx < 1 || xx > n || yy < 1 || yy > n) continue;
      if (vis[xx][yy]) continue;
      if (yy < y)
        cout << "?"
             << " " << xx << " " << yy << " " << x << " " << y << endl;
      else
        cout << "?"
             << " " << x << " " << y << " " << xx << " " << yy << endl;
      cin >> ans;
      ans ^= 1;
      a[xx][yy] = z ^ ans;
      b[xx][yy] = z ^ ans;
      if (!vis[xx][yy]) {
        vis[xx][yy] = 1;
        q.push({xx, yy, z ^ ans});
      }
    }
  }
}
void solve() {
  queue<node> q1, q2;
  q1.push({1, 2, 1});
  q2.push({1, 2, 0});
  vis[1][2] = 1;
  a[1][2] = 1;
  b[1][2] = 0;
  int ans;
  while (!q1.empty()) {
    node p1 = q1.front(), p2 = q2.front();
    q1.pop();
    q2.pop();
    int x = p1.x, y = p1.y, z1 = p1.z, z2 = p2.z;
    for (int i = 1; i <= 4; i++) {
      int xx = x + dx1[i], yy = y + dy1[i];
      if (xx < 1 || xx > n || yy < 1 || yy > n) continue;
      if (vis[xx][yy]) continue;
      if (yy < y)
        cout << "?"
             << " " << xx << " " << yy << " " << x << " " << y << endl;
      else
        cout << "?"
             << " " << x << " " << y << " " << xx << " " << yy << endl;
      cin >> ans;
      ans ^= 1;
      a[xx][yy] = z1 ^ ans;
      b[xx][yy] = z2 ^ ans;
      if (!vis[xx][yy]) {
        vis[xx][yy] = 1;
        q1.push({xx, yy, z1 ^ ans});
        q2.push({xx, yy, z2 ^ ans});
      }
    }
  }
}
int dp1[55][55][55][55], dp2[55][55][55][55];
int main() {
  scanf("%d", &n);
  bfs();
  solve();
  for (int x1 = n; x1 >= 1; x1--) {
    for (int y1 = n; y1 >= 1; y1--) {
      for (int x2 = x1; x2 <= n; x2++) {
        for (int y2 = y1; y2 <= n; y2++) {
          if (x2 - x1 + y2 - y1 <= 2) {
            dp1[x1][y1][x2][y2] = (a[x1][y1] == a[x2][y2]);
            dp2[x1][y1][x2][y2] = (b[x1][y1] == b[x2][y2]);
            continue;
          }
          if (a[x1][y1] != a[x2][y2])
            dp1[x1][y1][x2][y2] = 0;
          else {
            dp1[x1][y1][x2][y2] =
                (dp1[x1 + 1][y1][x2 - 1][y2] | dp1[x1 + 1][y1][x2][y2 - 1] |
                 dp1[x1][y1 + 1][x2 - 1][y2] | dp1[x1][y1 + 1][x2][y2 - 1]);
          }
          if (b[x1][y1] != b[x2][y2])
            dp2[x1][y1][x2][y2] = 0;
          else {
            dp2[x1][y1][x2][y2] =
                (dp2[x1 + 1][y1][x2 - 1][y2] | dp2[x1 + 1][y1][x2][y2 - 1] |
                 dp2[x1][y1 + 1][x2 - 1][y2] | dp2[x1][y1 + 1][x2][y2 - 1]);
          }
        }
      }
    }
  }
  for (int x1 = 1; x1 <= n; x1++) {
    for (int y1 = 1; y1 <= n; y1++) {
      for (int x2 = x1; x2 <= n; x2++) {
        for (int y2 = y1; y2 <= n; y2++) {
          if (dp1[x1][y1][x2][y2] != dp2[x1][y1][x2][y2] &&
              x2 - x1 + y2 - y1 >= 2) {
            cout << "?"
                 << " " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
            int ans;
            cin >> ans;
            if (ans == dp1[x1][y1][x2][y2]) {
              cout << "!" << endl;
              for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= n; j++) cout << a[i][j];
                cout << endl;
              }
              return 0;
            } else {
              cout << "!" << endl;
              for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= n; j++) cout << b[i][j];
                cout << endl;
              }
              return 0;
            }
          }
        }
      }
    }
  }
  return 0;
}
