#include <bits/stdc++.h>
using namespace std;
int ask(int x, int y, int xx, int yy) {
  if ((x + y) > (xx + yy)) {
    swap(x, xx);
    swap(y, yy);
  }
  cout << "? " << (x + 1) << " " << (y + 1) << " " << (xx + 1) << " "
       << (yy + 1) << "\n";
  cout.flush();
  int res;
  cin >> res;
  return res;
}
void print(vector<vector<int>> &ta) {
  cout << "!"
       << "\n";
  int n = ta.size();
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      cout << ta[i][j];
    }
    cout << "\n";
  }
  cout.flush();
}
void make_table(vector<vector<int>> &ta2, vector<vector<bool>> &dp2) {
  int n = ta2.size();
  for (int i = 0; i < n * n; i++) {
    dp2[i][i] = true;
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      int nx = i + 1, ny = j;
      if (nx < n && ta2[i][j] == ta2[nx][ny]) {
        dp2[n * i + j][nx * n + ny] = true;
      }
      nx = i, ny = j + 1;
      if (ny < n && ta2[i][j] == ta2[nx][ny]) {
        dp2[n * i + j][nx * n + ny] = true;
      }
    }
  }
  for (int len = 3; len < 2 * n; len += 2) {
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        for (int k = 0; k <= len; k++) {
          int h = len - k;
          int nx = i + k;
          int ny = j + h;
          if (nx < 0 || ny < 0 || nx >= n || ny >= n) continue;
          if (ta2[i][j] != ta2[nx][ny]) {
            dp2[i * n + j][nx * n + ny] = false;
            continue;
          }
          if ((i + 1) < n && (nx - 1) >= 0) {
            if (dp2[(i + 1) * n + j][(nx - 1) * n + ny])
              dp2[i * n + j][nx * n + ny] = true;
          }
          if ((i + 1) < n && (ny - 1) >= 0) {
            if (dp2[(i + 1) * n + j][nx * n + (ny - 1)])
              dp2[i * n + j][nx * n + ny] = true;
          }
          if ((j + 1) < n && (nx - 1) >= 0) {
            if (dp2[i * n + (j + 1)][(nx - 1) * n + ny])
              dp2[i * n + j][nx * n + ny] = true;
          }
          if ((j + 1) < n && (ny - 1) >= 0) {
            if (dp2[i * n + (j + 1)][nx * n + (ny - 1)])
              dp2[i * n + j][nx * n + ny] = true;
          }
        }
      }
    }
  }
}
int sol(vector<vector<int>> &ta2, vector<vector<int>> &ta3) {
  int n = ta2.size();
  vector<vector<bool>> dp2(n * n, vector<bool>(n * n, false)), dp3 = dp2;
  make_table(ta2, dp2);
  make_table(ta3, dp3);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      for (int nx = 0; nx < n; nx++) {
        for (int ny = 0; ny < n; ny++) {
          if ((abs(i - nx) + abs(j - ny)) < 2) continue;
          if (dp2[i * n + j][nx * n + ny] != dp3[i * n + j][nx * n + ny]) {
            int tt = ask(i, j, nx, ny);
            bool bo = (tt == 1) ? true : false;
            if (bo == dp2[i * n + j][nx * n + ny])
              return 0;
            else
              return 1;
          }
        }
      }
    }
  }
  return 0;
}
int main() {
  int n;
  cin >> n;
  vector<vector<int>> ta(n, vector<int>(n, -1));
  ta[0][0] = 1;
  ta[n - 1][n - 1] = 0;
  stack<pair<int, int>> st;
  st.push(make_pair(0, 0));
  vector<vector<int>> hou = {{0, 2}, {1, 1}, {2, 0}};
  while (st.size()) {
    pair<int, int> p0 = st.top();
    st.pop();
    int cx = p0.first, cy = p0.second;
    for (vector<int> v0 : hou) {
      int nx = cx + v0[0];
      int ny = cy + v0[1];
      if (nx >= n || ny >= n || nx < 0 || ny < 0) continue;
      if (ta[nx][ny] != -1) continue;
      int tt = ask(cx, cy, nx, ny);
      if (tt) {
        ta[nx][ny] = ta[cx][cy];
      } else {
        ta[nx][ny] = ta[cx][cy] ^ 1;
      }
      st.push(make_pair(nx, ny));
    }
  }
  vector<vector<int>> ta2 = ta;
  vector<vector<int>> hou2 = {{0, 2},  {1, 1},   {2, 0},
                              {0, -2}, {-1, -1}, {-2, 0}};
  ta2[1][2] = 0;
  st.push(make_pair(1, 2));
  while (st.size()) {
    pair<int, int> p0 = st.top();
    st.pop();
    int cx = p0.first, cy = p0.second;
    for (vector<int> v0 : hou2) {
      int nx = cx + v0[0];
      int ny = cy + v0[1];
      if (nx >= n || ny >= n || nx < 0 || ny < 0) continue;
      if (ta2[nx][ny] != -1) continue;
      int tt = ask(cx, cy, nx, ny);
      if (tt) {
        ta2[nx][ny] = ta2[cx][cy];
      } else {
        ta2[nx][ny] = ta2[cx][cy] ^ 1;
      }
      st.push(make_pair(nx, ny));
    }
  }
  vector<vector<int>> ta3 = ta2;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if ((i + j) & 1) ta3[i][j] ^= 1;
    }
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
    }
  }
  if (sol(ta2, ta3)) {
    print(ta3);
  } else
    print(ta2);
  return 0;
}
