#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int> > adj[5000];
vector<int> adjnorm[5001];
bool vis[5000];
int ass[5001];
int n;
int rc(int ro, int co) { return (ro - 1) * n + (co - 1); }
void dfs(int node, int col) {
  if (!vis[node]) {
    vis[node] = true;
    ass[node] = col;
    for (int i = 0; i < adj[node].size(); i++) {
      dfs(adj[node][i].second, col ^ adj[node][i].first);
    }
  }
}
int check4(int node, int cnt, bool xorv) {
  if (xorv == 1 && cnt == 3) {
    return -1;
  } else if (cnt == 3) {
    return node;
  }
  int result = -1;
  for (int i = 0; i < adjnorm[node].size(); i++) {
    if (adjnorm[node][i] > node) {
      result = max(result, check4(adjnorm[node][i], cnt + 1,
                                  xorv ^ ass[adjnorm[node][i]]));
    }
  }
  return result;
}
int main() {
  int res;
  cin >> n;
  for (int i = 1; i < n; i++) {
    for (int j = 1; j < n; j++) {
      cout << "? " << i << ' ' << j << ' ' << i + 1 << ' ' << j + 1 << endl;
      cin >> res;
      adj[rc(i + 1, j + 1)].emplace_back(!res, rc(i, j));
      adj[rc(i, j)].emplace_back(!res, rc(i + 1, j + 1));
      if (res == -1) return 0;
    }
  }
  for (int i = 1; i < n; i += 2) {
    if (i + 2 <= n) {
      cout << "? " << 1 << ' ' << i << ' ' << 1 << ' ' << i + 2 << endl;
      cin >> res;
      adj[rc(1, i)].emplace_back(!res, rc(1, i + 2));
      adj[rc(1, i + 2)].emplace_back(!res, rc(1, i));
      if (res == -1) return 0;
      cout << "? " << n << ' ' << i << ' ' << n << ' ' << i + 2 << endl;
      cin >> res;
      adj[rc(n, i)].emplace_back(!res, rc(n, i + 2));
      adj[rc(n, i + 2)].emplace_back(!res, rc(n, i));
      if (res == -1) return 0;
    }
    if (i + 2 <= n) {
      cout << "? " << 2 << ' ' << i << ' ' << 2 << ' ' << i + 2 << endl;
      cin >> res;
      adj[rc(2, i)].emplace_back(!res, rc(2, i + 2));
      adj[rc(2, i + 2)].emplace_back(!res, rc(2, i));
      if (res == -1) return 0;
      cout << "? " << n - 1 << ' ' << i << ' ' << n - 1 << ' ' << i + 2 << endl;
      cin >> res;
      adj[rc(n - 1, i)].emplace_back(!res, rc(n - 1, i + 2));
      adj[rc(n - 1, i + 2)].emplace_back(!res, rc(n - 1, i));
      if (res == -1) return 0;
    }
  }
  for (int i = 0; i < n * n; i++) {
    vis[i] = false;
  }
  for (int i = 0; i < n * n; i++) {
    if (!vis[i]) dfs(i, 1);
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if (j + 1 <= n) {
        adjnorm[rc(i, j)].push_back(rc(i, j + 1));
        adjnorm[rc(i, j + 1)].push_back(rc(i, j));
      }
      if (i + 1 <= n) {
        adjnorm[rc(i, j)].push_back(rc(i + 1, j));
        adjnorm[rc(i + 1, j)].push_back(rc(i, j));
      }
    }
  }
  for (int i = 0; i < n * n; i++) {
    int lastind = check4(i, 0, ass[i]);
    if (lastind != -1) {
      cout << "? " << i / n + 1 << ' ' << i % n + 1 << ' ' << lastind / n + 1
           << ' ' << lastind % n + 1 << endl;
      cin >> res;
      if (res == -1) return 0;
      adj[i].emplace_back(!res, lastind);
      adj[lastind].emplace_back(!res, i);
      break;
    }
  }
  for (int i = 0; i < n * n; i++) vis[i] = false;
  dfs(0, 1);
  cout << "!" << endl;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      cout << ass[rc(i, j)];
    }
    cout << endl;
  }
}
