#include <bits/stdc++.h>
using namespace std;
int dx[8] = {0, 0, 2, -2, 1, -1}, dy[8] = {2, -2, 0, 0, 1, -1}, a[2][100][100];
int cx[4] = {3, 2, 1, 0}, cy[4] = {0, 1, 2, 3}, n;
int inp() {
  char c = getchar();
  while (c < '0' || c > '9') c = getchar();
  int sum = 0;
  while (c >= '0' && c <= '9') {
    sum = sum * 10 + c - '0';
    c = getchar();
  }
  return sum;
}
int query(int x1, int y1, int x2, int y2) {
  printf("? %d %d %d %d\n", x1, y1, x2, y2);
  fflush(stdout);
  return inp();
}
void work(int id) {
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) {
      if (a[1][i][j] == -1)
        continue;
      else {
        if (!id)
          a[0][i][j] = a[1][i][j];
        else
          a[0][i][j] = a[1][i][j] ^ 1;
      }
    }
  printf("!\n");
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      cout << a[0][i][j];
    }
    cout << endl;
  }
  exit(0);
}
vector<pair<int, int>> v;
int ok = 0, xx, yy;
void dfs(int x1, int y1, int x2, int y2) {
  if (ok) return;
  v.push_back(make_pair(x1, y1));
  if (x1 == x2 && y1 == y2) {
    int tmp0 = a[0][v[0].first][v[0].second] ^ a[0][v[2].first][v[2].second];
    int tmp1 = a[1][v[1].first][v[1].second] ^ a[1][v[3].first][v[3].second];
    if (tmp0 == tmp1) ok = 1;
    if (!ok) return;
    int tmp = 0;
    if (ok) tmp = query(xx, yy, x2, y2);
    if (tmp == 1)
      work(a[0][xx][yy] ^ a[1][x2][y2]);
    else {
      work(a[0][xx][yy] ^ a[1][x2][y2] ^ 1);
    }
    exit(0);
  }
  if (x1 < x2) {
    dfs(x1 + 1, y1, x2, y2);
    v.pop_back();
  }
  if (y1 < y2) {
    dfs(x1, y1 + 1, x2, y2);
    v.pop_back();
  }
}
void dfs1(int x1, int y1, int x2, int y2) {
  if (ok) return;
  v.push_back(make_pair(x1, y1));
  if (x1 == x2 && y1 == y2) {
    int tmp0 = a[0][v[1].first][v[1].second] ^ a[0][v[3].first][v[3].second];
    int tmp1 = a[1][v[0].first][v[0].second] ^ a[1][v[2].first][v[2].second];
    if (tmp0 == tmp1) ok = 1;
    if (!ok) return;
    int tmp = 0;
    if (ok) tmp = query(xx, yy, x2, y2);
    if (tmp == 1)
      work(a[1][xx][yy] ^ a[0][x2][y2]);
    else {
      work(a[1][xx][yy] ^ a[0][x2][y2] ^ 1);
    }
    exit(0);
  }
  if (x1 < x2) {
    dfs1(x1 + 1, y1, x2, y2);
    v.pop_back();
  }
  if (y1 < y2) {
    dfs1(x1, y1 + 1, x2, y2);
    v.pop_back();
  }
}
queue<pair<int, int>> q;
void bfs(int id, int xx, int yy) {
  q.push(make_pair(xx, yy));
  while (!q.empty()) {
    pair<int, int> u = q.front(), v;
    q.pop();
    for (int i = 0; i < 8; i++) {
      int x = u.first + dx[i], y = u.second + dy[i];
      if (x > n || y > n || x < 1 || y < 1 || a[id][x][y] != -1) continue;
      int tmp;
      v = make_pair(x, y);
      if (u < v)
        tmp = query(u.first, u.second, x, y);
      else
        tmp = query(x, y, u.first, u.second);
      if (tmp == 1)
        a[id][x][y] = a[id][u.first][u.second];
      else
        a[id][x][y] = a[id][u.first][u.second] ^ 1;
      q.push(make_pair(x, y));
    }
  }
}
int main() {
  cin >> n;
  memset(a, -1, sizeof(a));
  a[0][1][1] = 1;
  a[0][n][n] = 0;
  bfs(0, 1, 1);
  a[1][1][2] = 1;
  bfs(1, 1, 2);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) {
      if (a[0][i][j] == -1) continue;
      for (int k = 0; k < 4; k++) {
        int x = i + cx[k], y = j + cy[k];
        if (x > n || y > n) continue;
        xx = i, yy = j;
        v.clear();
        dfs(i, j, x, y);
      }
    }
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) {
      if (a[0][i][j] == 1) continue;
      for (int k = 0; k < 4; k++) {
        int x = i + cx[k], y = j + cy[k];
        if (x > n || y > n) continue;
        xx = i, yy = j;
        v.clear();
        dfs1(i, j, x, y);
      }
    }
}
