#include <bits/stdc++.h>
using std::make_pair;
using std::pair;
const int N = 60;
const int M = N * N;
bool visited[M];
int values[M];
int n;
std::vector<std::pair<int, int>> neighbors[M];
int get_id(int x, int y) { return (x - 1) * n + y; }
std::pair<int, int> decode(int id) {
  int x = (id + n - 1) / n;
  int y = id % n;
  if (y == 0) y = n;
  return std::make_pair(x, y);
}
int base_ask(int x1, int y1, int x2, int y2) {
  std::cout << "? " << x1 << " " << y1 << " " << x2 << " " << y2 << std::endl;
  int result;
  std::cin >> result;
  return result;
}
void add_edge(int u, int v, int r) {
  neighbors[u].push_back(std::make_pair(v, r));
  neighbors[v].push_back(std::make_pair(u, r));
}
void ask(int x1, int y1, int x2, int y2) {
  if (x2 > n || y2 > n) return;
  if (x2 == n && y2 == n) return;
  int result = base_ask(x1, y1, x2, y2);
  add_edge(get_id(x1, y1), get_id(x2, y2), result);
}
void dfs(int id) {
  if (visited[id]) return;
  visited[id] = true;
  for (auto p : neighbors[id]) {
    int v = p.first;
    int r = p.second;
    if (visited[v]) continue;
    values[v] = values[id] ^ r ^ 1;
    dfs(v);
  }
}
bool find_routes(int x, int y, std::vector<int>& routes) {
  routes.push_back(get_id(x, y));
  if (routes.size() == 4) {
    bool r1 = values[routes[0]] == values[routes[2]];
    bool r2 = values[routes[1]] == values[routes[3]];
    if (r1 == r2) {
      return true;
    }
  } else {
    if (x + 1 <= n && find_routes(x + 1, y, routes)) {
      return true;
    }
    if (y + 1 <= n && find_routes(x, y + 1, routes)) {
      return true;
    }
  }
  routes.pop_back();
  return false;
}
void run(int case_id = 0) {
  std::cin >> n;
  for (int x = 1; x <= n; ++x) {
    for (int y = 1; y <= n; ++y) {
      ask(x, y, x, y + 2);
      if ((x + y) % 2 == 0 && y == 1) {
        ask(x, y, x + 2, y);
        ask(x, y, x + 1, y + 1);
      } else if ((x + y) % 2 == 1 && y <= 2) {
        ask(x, y, x + 1, y + 1);
      }
    }
  }
  values[get_id(1, 1)] = 1;
  values[get_id(1, 2)] = -1;
  dfs(get_id(1, 1));
  dfs(get_id(1, 2));
  bool valid = false;
  for (int x = 1; x <= n && !valid; ++x) {
    for (int y = 1; y <= n && !valid; ++y) {
      std::vector<int> v;
      if (find_routes(x, y, v)) {
        auto p0 = decode(v[0]);
        auto p3 = decode(v[3]);
        int r = base_ask(p0.first, p0.second, p3.first, p3.second);
        add_edge(v[0], v[3], r);
        valid = true;
        break;
      }
    }
  }
  assert(valid);
  memset(visited, 0, sizeof(visited));
  memset(values, 0, sizeof(values));
  values[get_id(1, 1)] = 1;
  values[get_id(n, n)] = 0;
  dfs(get_id(1, 1));
  dfs(get_id(n, n));
  std::cout << "!" << std::endl;
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) {
      std::cout << values[get_id(i, j)];
    }
    std::cout << "\n";
  }
  std::cout.flush();
}
int main() {
  std::ios::sync_with_stdio(false);
  run();
  return 0;
}
