#include <bits/stdc++.h>
using namespace std;
int n, a[55][55], p[55][55];
int rs[55][55][55][55], cntQ = 0;
vector<pair<int, int> > way;
struct data {
  int fr, to, wei;
  data(int F, int T, int W) {
    fr = F;
    to = T;
    wei = W;
  }
};
vector<data> adj[55][55];
void readf() { cin >> n; }
int ask(int x, int y, int u, int v) {
  int &ans = rs[x][y][u][v];
  if (ans != -1) return ans;
  ++cntQ;
  cout << '?' << ' ' << x << ' ' << y << ' ' << u << ' ' << v << '\n';
  cout.flush();
  cin >> ans;
  return ans;
}
void add(int x, int y, int u, int v, int w) {
  adj[x][y].emplace_back(u, v, w);
  adj[u][v].emplace_back(x, y, w);
}
void DFS(int u, int v, int pu, int pv) {
  for (auto it : adj[u][v])
    if (it.fr != pu || it.to != pv) {
      p[it.fr][it.to] = p[u][v] ^ it.wei;
      DFS(it.fr, it.to, u, v);
    }
}
void solve() {
  cntQ = 0;
  memset(p, -1, sizeof(p));
  memset(rs, -1, sizeof(rs));
  p[1][1] = 1;
  p[n][n] = 0;
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= n; ++j)
      if ((i + j) % 2 == 0) {
        if (j + 2 <= n && p[i][j + 2] == -1)
          p[i][j + 2] = p[i][j] ^ ask(i, j, i, j + 2) ^ 1;
        if (i + 2 <= n && j == 1 && p[i + 2][j] == -1)
          p[i + 2][j] = p[i][j] ^ ask(i, j, i + 2, j) ^ 1;
        if (i < n && j == 1 && p[i + 1][j + 1] == -1)
          p[i + 1][j + 1] = p[i][j] ^ ask(i, j, i + 1, j + 1) ^ 1;
      }
  for (int i = (1); i <= (n); ++i) way.emplace_back(i, 1);
  for (int i = (2); i <= (n); ++i) way.emplace_back(n, i);
  for (int i = 0; i < way.size() - 3; ++i)
    if (ask(way[i].first, way[i].second, way[i + 2].first, way[i + 2].second) ==
        ask(way[i + 1].first, way[i + 1].second, way[i + 3].first,
            way[i + 3].second)) {
      if (ask(way[i].first, way[i].second, way[i + 3].first,
              way[i + 3].second)) {
        if ((way[i + 3].first + way[i + 3].second) & 1)
          p[way[i + 3].first][way[i + 3].second] =
              p[way[i].first][way[i].second];
        else
          p[way[i].first][way[i].second] =
              p[way[i + 3].first][way[i + 3].second];
      } else {
        if ((way[i + 3].first + way[i + 3].second) & 1)
          p[way[i + 3].first][way[i + 3].second] =
              p[way[i + 2].first][way[i + 2].second] ^
              ask(way[i].first, way[i].second, way[i + 2].first,
                  way[i + 2].second);
        else
          p[way[i].first][way[i].second] =
              p[way[i + 1].first][way[i + 1].second] ^
              ask(way[i + 1].first, way[i + 1].second, way[i + 3].first,
                  way[i + 3].second);
      }
      break;
    }
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j)
      if ((i + j) % 2 == 1) {
        if (j + 2 <= n) {
          add(i, j, i, j + 2, ask(i, j, i, j + 2) ^ 1);
        }
      }
    if (i % 2 == 0 && i + 2 <= n) {
      add(i, 1, i + 2, 1, ask(i, 1, i + 2, 1) ^ 1);
    }
    if (i % 2 == 0 && i + 1 <= n) {
      add(i, 1, i + 1, 2, ask(i, 1, i + 1, 2) ^ 1);
    } else if (i == 1) {
      add(1, 2, 2, 3, ask(1, 2, 2, 3) ^ 1);
    }
  }
  for (int i = (1); i <= (n); ++i)
    for (int j = (1); j <= (n); ++j)
      if (p[i][j] != -1 && (i + j) % 2 == 1) {
        DFS(i, j, 0, 0);
        goto nxt;
      }
nxt:;
  cout << "!\n";
  for (int i = (1); i <= (n); ++i) {
    for (int j = (1); j <= (n); ++j) cout << p[i][j];
    cout << '\n';
  }
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  readf();
  solve();
}
