#include <bits/stdc++.h>
using namespace std;
void err(istream_iterator<string> it) {}
template <typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
  cerr << *it << " = " << a << endl;
  err(++it, args...);
}
const int INF = 1e9 + 7;
const int mod = 1e9 + 7;
long long int powmod(long long int a, long long int b) {
  long long int res = 1;
  a %= mod;
  assert(b >= 0);
  for (; b; b >>= 1) {
    if (b & 1) res = res * a % mod;
    a = a * a % mod;
  }
  return res;
}
int nxt() {
  int x;
  cin >> x;
  return x;
}
vector<vector<int> > ans;
void sets(int x1, int y1, int x2, int y2) {
  printf("? %d %d %d %d\n", x1, y1, x2, y2);
  fflush(stdout);
  if (nxt() == 1) {
    ans[x2][y2] = ans[x1][y1];
  } else {
    ans[x2][y2] = 1 ^ ans[x1][y1];
  }
}
bool done, p;
int n;
void haha(int x1, int y1, int x3, int y3, int x2, int y2, int x4, int y4) {
  if (done) return;
  if (x2 > n || y2 > n || x3 > n || y3 > n || x4 > n || y4 > n) return;
  if (ans[x1][y1] ^ ans[x3][y3] != ans[x2][y2] ^ ans[x4][y4]) return;
  printf("? %d %d %d %d\n", x1, y1, x4, y4);
  done = true;
  if (nxt() == 1) {
    if (ans[x1][y1] == ans[x3][y3]) {
      if (ans[x1][y1] != ans[x2][y2]) {
        p = true;
      }
    } else {
      if (ans[x2][y2] != ans[x3][y3]) {
        p = true;
      }
    }
  } else {
    if (ans[x1][y1] == ans[x3][y3]) {
      if (ans[x1][y1] == ans[x2][y2]) {
        p = true;
      }
    } else {
      if (ans[x2][y2] == ans[x3][y3]) {
        p = true;
      }
    }
  }
}
int main() {
  n = nxt();
  ans.assign(n + 1, vector<int>(n + 1, 0));
  ans[1][1] = 1;
  done = false;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if (i == 1 && j <= 2) continue;
      if ((i + j) % 2 == 0) {
        if (j == 1) {
          sets(i - 2, j, i, j);
        } else if (j == 2) {
          sets(i - 1, j - 1, i, j);
        } else {
          sets(i, j - 2, i, j);
        }
      } else {
        if (j == 1) {
          continue;
        } else if (j == 2) {
          sets(i - 1, j - 1, i, j);
        } else if (j == 3) {
          sets(i - 1, j - 1, i, j);
          printf("? %d %d %d %d\n", i, j - 2, i, j);
          fflush(stdout);
          if (nxt() == 1) {
            ans[i][j - 2] = ans[i][j];
          } else {
            ans[i][j - 2] = 1 ^ ans[i][j];
          }
        } else {
          sets(i, j - 2, i, j);
        }
      }
    }
  }
  for (int i = 1; i <= n; i += 1) {
    for (int j = 1; j <= n; j += 1) {
      if (done) break;
      haha(i, j, i, j + 2, i, j + 1, i, j + 3);
      haha(i, j, i, j + 2, i, j + 1, i + 1, j + 2);
      haha(i, j, i + 1, j + 1, i, j + 1, i + 1, j + 2);
      haha(i, j, i + 1, j + 1, i + 1, j, i + 1, j + 2);
      haha(i, j, i + 1, j + 1, i, j + 1, i + 2, j + 1);
      haha(i, j, i + 1, j + 1, i + 1, j, i + 2, j + 1);
      haha(i, j, i + 2, j, i + 1, j, i + 2, j + 1);
      haha(i, j, i + 2, j, i + 1, j, i + 3, j);
    }
  }
  puts("!");
  for (__typeof(n + 1) i = (1) - ((1) > (n + 1));
       i != (n + 1) - ((1) > (n + 1)); i += 1 - 2 * ((1) > (n + 1))) {
    for (__typeof(n + 1) j = (1) - ((1) > (n + 1));
         j != (n + 1) - ((1) > (n + 1)); j += 1 - 2 * ((1) > (n + 1))) {
      if (p && (i + j) % 2 == 1)
        printf("%d", 1 - ans[i][j]);
      else
        printf("%d", ans[i][j]);
    }
    puts("");
  }
  return 0;
}
