#include <bits/stdc++.h>
using namespace std;
class Solution {
 public:
  Solution(int n) : n(n), grid(n, string(n, ' ')) {
    grid[0][0] = '1';
    grid[0][1] = '0';
    grid[n - 1][n - 1] = '0';
  }
  void getGrid() {
    for (int i = 0; i < n; ++i) {
      for (int j = 0; j < n; ++j) {
        updateCell(i, j, i, j + 2);
        updateCell(i, j, i + 2, j);
        updateCell(i, j, i + 1, j + 1);
        updateCell(i, j, i, j - 2);
        updateCell(i, j, i - 2, j);
        updateCell(i, j, i - 1, j - 1);
      }
    }
    bool done = false;
    for (int i = 0; i < n && !done; ++i) {
      for (int j = 0; j < n && !done; ++j) {
        done = findCellAndReverseGrid(i, j, i + 2, j + 1);
      }
    }
    cout << "!" << endl;
    for (const string& l : grid) cout << l << endl;
  }
  void updateCell(int r0, int c0, int r, int c) {
    if (r < 0 || r >= n || c < 0 || c >= n) return;
    if (grid[r][c] != ' ') return;
    if (r0 < 0 || r0 >= n || c0 < 0 || c0 >= n) return;
    if (grid[r0][c0] == ' ') return;
    cout << "? " << (min(r, r0) + 1) << ' ' << (min(c, c0) + 1) << ' '
         << (max(r, r0) + 1) << ' ' << (max(c, c0) + 1) << endl;
    int a;
    cin >> a;
    grid[r][c] = a != 0 ? grid[r0][c0] : grid[r0][c0] ^ 1;
  }
  bool findCellAndReverseGrid(int r0, int c0, int r, int c) {
    if (r < 0 || r >= n || c < 0 || c >= n) return false;
    if (r0 < 0 || r0 >= n || c0 < 0 || c0 >= n) return false;
    bool v0 =
        grid[r0][c0] == grid[r][c] && (grid[r0 + 1][c0] == grid[r][c - 1] ||
                                       grid[r0][c0 + 1] == grid[r][c - 1] ||
                                       grid[r0 + 1][c0] == grid[r - 1][c] ||
                                       grid[r0][c0 + 1] == grid[r - 1][c]);
    bool v1 =
        grid[r0][c0] != grid[r][c] && (grid[r0 + 1][c0] != grid[r][c - 1] ||
                                       grid[r0][c0 + 1] != grid[r][c - 1] ||
                                       grid[r0 + 1][c0] != grid[r - 1][c] ||
                                       grid[r0][c0 + 1] != grid[r - 1][c]);
    if (v0 == v1) return false;
    cout << "? " << (r0 + 1) << ' ' << (c0 + 1) << ' ' << (r + 1) << ' '
         << (c + 1) << endl;
    int a;
    cin >> a;
    if (a != v0) {
      reverseEven();
    }
    return true;
  }
  void reverseEven() {
    for (int i = 0; i < n; ++i) {
      for (int j = 0; j < n; ++j) {
        if ((i + j) % 2 == 0) continue;
        grid[i][j] ^= 1;
      }
    }
  }
  int n = 0;
  vector<string> grid;
};
int main() {
  int n;
  cin >> n;
  Solution(n).getGrid();
  return 0;
}
