#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 51;
int n;
int arr[MAX_N][MAX_N];
vector<pair<pair<int, int>, bool>> adj[MAX_N][MAX_N];
bool ask(int x1, int y1, int x2, int y2) {
  cout << "? " << x1 + 1 << " " << y1 + 1 << " " << x2 + 1 << " " << y2 + 1
       << endl;
  bool res;
  cin >> res;
  return res;
}
bool ask(pair<int, int> p1, pair<int, int> p2) {
  return ask(p1.first, p1.second, p2.first, p2.second);
}
void addEdge(int x1, int y1, int x2, int y2) {
  bool b = ask(x1, y1, x2, y2);
  adj[x1][y1].push_back(make_pair(make_pair(x2, y2), b));
  adj[x2][y2].push_back(make_pair(make_pair(x1, y1), b));
}
void dfs(int x, int y, int c) {
  arr[x][y] = c;
  for (auto k : adj[x][y]) {
    pair<int, int> p = k.first;
    bool b = k.second;
    int val = c;
    if (!b) {
      if (c > 1)
        val = 5 - c;
      else
        val = c ^ 1;
    }
    if (arr[p.first][p.second] == -1) {
      dfs(p.first, p.second, val);
    }
  }
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) arr[i][j] = -1;
  addEdge(0, 0, 1, 1);
  addEdge(0, 1, 1, 2);
  for (int i = 0; i < 2; i++)
    for (int j = 0; j + 2 < n; j++) {
      addEdge(i, j, i, j + 2);
    }
  for (int i = 0; i + 2 < n; i++) {
    for (int j = 0; j < n; j++) {
      addEdge(i, j, i + 2, j);
    }
  }
  dfs(0, 0, 1);
  dfs(0, 1, 2);
  vector<pair<int, pair<int, int>>> path;
  pair<int, int> cur = make_pair(0, 0);
  while (cur != make_pair(n - 1, n - 1)) {
    path.push_back(make_pair(arr[cur.first][cur.second], cur));
    if (cur.second != n - 1)
      cur.second++;
    else
      cur.first++;
  }
  path.push_back(make_pair(arr[cur.first][cur.second], cur));
  map<int, int> fuck;
  fuck[2] = -1;
  fuck[3] = -1;
  for (int i = 0; i + 4 < (int)path.size(); i += 2) {
    if (path[i].first == 1 && path[i + 4].first == 0) {
      if (path[i + 2].first == 1) {
        if (path[i + 1].first == path[i + 3].first) {
          bool b = ask(path[i].second, path[i + 3].second);
          if (b) {
            fuck[path[i + 3].first] = path[i].first;
            fuck[5 - path[i + 3].first] = 1 ^ path[i].first;
          } else {
            fuck[path[i + 3].first] = 1 ^ path[i].first;
            fuck[5 - path[i + 3].first] = path[i].first;
          }
        } else {
          bool b = ask(path[i + 1].second, path[i + 4].second);
          if (b) {
            fuck[path[i + 1].first] = path[i + 4].first;
            fuck[5 - path[i + 1].first] = 1 ^ path[i + 4].first;
          } else {
            fuck[path[i + 1].first] = 1 ^ path[i + 4].first;
            fuck[5 - path[i + 1].first] = path[i + 4].first;
          }
        }
      } else {
        if (path[i + 1].first == path[i + 3].first) {
          bool b = ask(path[i + 1].second, path[i + 4].second);
          if (b) {
            fuck[path[i + 1].first] = path[i + 4].first;
            fuck[5 - path[i + 1].first] = 1 ^ path[i + 4].first;
          } else {
            fuck[path[i + 1].first] = 1 ^ path[i + 4].first;
            fuck[5 - path[i + 1].first] = path[i + 4].first;
          }
        } else {
          bool b = ask(path[i].second, path[i + 3].second);
          if (b) {
            fuck[path[i + 3].first] = path[i].first;
            fuck[5 - path[i + 3].first] = 1 ^ path[i].first;
          } else {
            fuck[path[i + 3].first] = 1 ^ path[i].first;
            fuck[5 - path[i + 3].first] = path[i].first;
          }
        }
      }
      break;
    }
  }
  assert(fuck[2] != -1);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      if (arr[i][j] > 1) arr[i][j] = fuck[arr[i][j]];
  cout << "!" << endl;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) cout << arr[i][j];
    cout << endl;
  }
}
