#include <bits/stdc++.h>
using namespace std;
int n, ans;
struct node {
  int x, y, v;
  node(int a, int b, int c) : x(a), y(b), v(c) {}
};
int pic[100][100], pic1[100][100], pic2[100][100];
int q[2][4][100][100];
void bfs(int x, int y, int v) {
  queue<node> q;
  node p(x, y, v);
  q.push(p);
  while (!q.empty()) {
    node t = q.front();
    q.pop();
    int x = t.x, y = t.y, v = t.v;
    if (x + 2 >= 1 && x + 2 <= n && y >= 1 && y <= n && pic[x + 2][y] == -1) {
      printf("? %d %d %d %d\n", x, y, x + 2, y);
      fflush(stdout);
      cin >> ans;
      if (ans == 1) {
        pic[x + 2][y] = v;
        q.push(node(x + 2, y, v));
      } else {
        pic[x + 2][y] = (v ^ 1);
        q.push(node(x + 2, y, (v ^ 1)));
      }
    }
    if (x >= 1 && x <= n && y + 2 >= 1 && y + 2 <= n && pic[x][y + 2] == -1) {
      printf("? %d %d %d %d\n", x, y, x, y + 2);
      fflush(stdout);
      cin >> ans;
      if (ans == 1) {
        pic[x][y + 2] = v;
        q.push(node(x, y + 2, v));
      } else {
        pic[x][y + 2] = (v ^ 1);
        q.push(node(x, y + 2, (v ^ 1)));
      }
    }
    if (x + 1 >= 1 && x + 1 <= n && y + 1 >= 1 && y + 1 <= n &&
        pic[x + 1][y + 1] == -1) {
      printf("? %d %d %d %d\n", x, y, x + 1, y + 1);
      fflush(stdout);
      cin >> ans;
      if (ans == 1) {
        pic[x + 1][y + 1] = v;
        q.push(node(x + 1, y + 1, v));
      } else {
        pic[x + 1][y + 1] = (v ^ 1);
        q.push(node(x + 1, y + 1, (v ^ 1)));
      }
    }
    if (x - 2 >= 1 && x - 2 <= n && y >= 1 && y <= n && pic[x - 2][y] == -1) {
      printf("? %d %d %d %d\n", x - 2, y, x, y);
      fflush(stdout);
      cin >> ans;
      if (ans == 1) {
        pic[x - 2][y] = v;
        q.push(node(x - 2, y, v));
      } else {
        pic[x - 2][y] = (v ^ 1);
        q.push(node(x - 2, y, (v ^ 1)));
      }
    }
    if (x >= 1 && x <= n && y - 2 >= 1 && y - 2 <= n && pic[x][y - 2] == -1) {
      printf("? %d %d %d %d\n", x, y - 2, x, y);
      fflush(stdout);
      cin >> ans;
      if (ans == 1) {
        pic[x][y - 2] = v;
        q.push(node(x, y - 2, v));
      } else {
        pic[x][y - 2] = (v ^ 1);
        q.push(node(x, y - 2, (v ^ 1)));
      }
    }
    if (x - 1 >= 1 && x - 1 <= n && y - 1 >= 1 && y - 1 <= n &&
        pic[x - 1][y - 1] == -1) {
      printf("? %d %d %d %d\n", x - 1, y - 1, x, y);
      fflush(stdout);
      cin >> ans;
      if (ans == 1) {
        pic[x - 1][y - 1] = v;
        q.push(node(x - 1, y - 1, v));
      } else {
        pic[x - 1][y - 1] = (v ^ 1);
        q.push(node(x - 1, y - 1, (v ^ 1)));
      }
    }
  }
}
int main() {
  cin >> n;
  memset(pic, -1, sizeof(pic));
  pic[1][1] = 1;
  pic[n][n] = 0;
  pic[1][2] = 1;
  bfs(1, 1, 1);
  bfs(1, 2, 1);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if ((i + j) % 2 == 0)
        pic1[i][j] = pic[i][j];
      else
        pic1[i][j] = 1 ^ pic[i][j];
    }
  }
  int ans, q1, q2, flag = 0;
  memset(q, -1, sizeof(q));
  for (int i = 1; i <= n; i++) {
    if (flag) break;
    for (int j = 1; j <= n; j++) {
      if (j + 3 > n) break;
      q1 = (pic[i][j] == pic[i][j + 3] && pic[i][j + 1] == pic[i][j + 2]);
      q2 = (pic1[i][j] == pic1[i][j + 3] && pic1[i][j + 1] == pic1[i][j + 2]);
      if (q1 != q2) {
        printf("? %d %d %d %d\n", i, j, i, j + 3);
        fflush(stdout);
        cin >> ans;
        if (ans == q1) {
          flag = 1;
          break;
        } else {
          flag = 2;
          break;
        }
      }
    }
  }
  for (int j = 1; j <= n; j++) {
    if (flag) break;
    for (int i = 1; i <= n; i++) {
      if (i + 3 > n) break;
      q1 = (pic[i][j] == pic[i + 3][j] && pic[i + 1][j] == pic[i + 2][j]);
      q2 = (pic1[i][j] == pic1[i + 3][j] && pic1[i + 1][j] == pic1[i + 2][j]);
      if (q1 != q2) {
        printf("? %d %d %d %d\n", i, j, i + 3, j);
        fflush(stdout);
        cin >> ans;
        if (ans == q1) {
          flag = 1;
          break;
        } else {
          flag = 2;
          break;
        }
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    if (flag) break;
    if (i + 2 > n) break;
    for (int j = 1; j <= n; j++) {
      if (j + 1 > n) break;
      q1 = (pic[i][j] == pic[i + 2][j + 1] &&
            pic[i][j + 1] == pic[i + 1][j + 1]);
      q2 = (pic1[i][j] == pic1[i + 2][j + 1] &&
            pic1[i][j + 1] == pic1[i + 1][j + 1]);
      if (q1 != q2) {
        printf("? %d %d %d %d\n", i, j, i + 2, j + 1);
        fflush(stdout);
        cin >> ans;
        if (ans == q1) {
          flag = 1;
          break;
        } else {
          flag = 2;
          break;
        }
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    if (flag) break;
    if (i + 1 > n) break;
    for (int j = 1; j <= n; j++) {
      if (j + 2 > n) break;
      q1 = (pic[i][j] == pic[i + 1][j + 2] && pic[i][j + 1] == pic[i][j + 2]);
      q2 = (pic1[i][j] == pic1[i + 1][j + 2] &&
            pic1[i][j + 1] == pic1[i][j + 2]);
      if (q1 != q2) {
        printf("? %d %d %d %d\n", i, j, i + 1, j + 2);
        fflush(stdout);
        cin >> ans;
        if (ans == q1) {
          flag = 1;
          break;
        } else {
          flag = 2;
          break;
        }
      }
    }
  }
  if (flag == 1) {
    printf("!\n");
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) {
        printf("%d", pic[i][j]);
      }
      printf("\n");
    }
  } else {
    printf("!\n");
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) {
        printf("%d", pic1[i][j]);
      }
      printf("\n");
    }
  }
  return 0;
}
