#include <bits/stdc++.h>   const int oo = 0x7fffffff;   const long long OO = 0x7fffffffffffffff;   using namespace std;   const int NX = 50;   typedef bitset<NX * NX * NX * NX> dp_t;   int n;   array<bitset<NX>, NX> board1, board2, done;   dp_t dp1, dp2;   int ask(int x1, int y1, int x2, int y2) {     cout <<  ?   << (1 + x1) <<     << (1 + y1) <<     << (1 + x2) <<              << (1 + y2) << endl;     int r;     cin >> r;     if (r == -1) exit(0);     return r;   }   void ask_n_set(int x1, int y1, int x2, int y2, bool forward = true) {     int r = ask(x1, y1, x2, y2) ^ 1;     if (forward) {       board1[x2][y2] = r ^ board1[x1][y1];       board2[x2][y2] = r ^ board2[x1][y1];       done[x2][y2] = 1;     } else {       board1[x1][y1] = r ^ board1[x2][y2];       board2[x1][y1] = r ^ board2[x2][y2];       done[x1][y1] = 1;     }   }   void print(const array<bitset<NX>, NX>& B) {     cout <<  ! n ;     for (int i = 0; i < n; ++i) {       for (int j = 0; j < n; ++j) cout << B[i][j];       cout <<   n ;     }     cout << endl;   }   void solve(const array<bitset<NX>, NX>& B, dp_t& dp) {     for (int x1 = 0; x1 < n; ++x1)       for (int y1 = 0; y1 < n; ++y1)         for (int x2 = 0; x2 < n; ++x2)           for (int y2 = 0; y2 < n; ++y2)             if ((abs(x1 - x2) + abs(y1 - y2)) <= 2)               dp[(y2 + NX * (x2 + NX * (y1 + NX * x1)))] = B[x1][y1] == B[x2][y2];     for (int x1 = 0; x1 < n; ++x1)       for (int y1 = 0; y1 < n; ++y1)         for (int x2 = x1 - 1; x2 >= 0; --x2)           for (int y2 = y1 - 1; y2 >= 0; --y2)             dp[(y2 + NX * (x2 + NX * (y1 + NX * x1)))] = 0;     for (int len = 3; len < (2 * n); ++len)       for (int x1 = 0; x1 < n; ++x1)         for (int y1 = 0; y1 < n; ++y1)           for (int x2 = x1; x2 < n; ++x2)             if ((abs(x1 - x2) + abs(y1 - y1)) <= len) {               int d = len - (x2 - x1);               int y2 = y1 + d;               if (y2 >= n) continue;               if (x1 == x2) {                 dp[(y2 + NX * (x2 + NX * (y1 + NX * x1)))] =                     B[x1][y1] == B[x2][y2] and                     dp[(y2 - 1 + NX * (x2 + NX * (y1 + 1 + NX * x1)))];               } else if (y1 == y2) {                 dp[(y2 + NX * (x2 + NX * (y1 + NX * x1)))] =                     B[x1][y1] == B[x2][y2] and                     dp[(y2 + NX * (x2 - 1 + NX * (y1 + NX * x1 + 1)))];               } else {                 dp[(y2 + NX * (x2 + NX * (y1 + NX * x1)))] =                     B[x1][y1] == B[x2][y2] and                     (dp[(y2 + NX * (x2 - 1 + NX * (y1 + NX * x1 + 1)))] or                      dp[(y2 - 1 + NX * (x2 + NX * (y1 + NX * x1 + 1)))] or                      dp[(y2 + NX * (x2 - 1 + NX * (y1 + 1 + NX * x1)))] or                      dp[(y2 - 1 + NX * (x2 + NX * (y1 + 1 + NX * x1)))]);               }             }   }   int main() {     cin >> n;     for (int i = 0; i < n; ++i)       for (int j = 0; j < n; ++j) done[i][j] = 0;     board2[0][0] = board1[0][0] = 1;     board2[n - 1][n - 1] = board1[n - 1][n - 1] = 0;     done[0][0] = done[n - 1][n - 1] = 1;     board1[0][1] = 1;     board2[0][1] = 0;     done[0][1] = 1;     ask_n_set(0, 1, 2, 1);     ask_n_set(1, 0, 2, 1, false);     for (int i = 0; i < n; ++i)       for (int j = 0; j < n; ++j)         if (not done[i][j]) {           int x, y;           if (i - 2 >= 0) {             x = i - 2;             y = j;           } else if (j - 2 >= 0) {             x = i;             y = j - 2;           } else {             x = i - 1;             y = j - 1;           }           ask_n_set(x, y, i, j);         }     solve(board1, dp1);     solve(board2, dp2);     for (int x1 = 0; x1 < n; ++x1)       for (int x2 = x1; x2 < n; ++x2)         for (int y1 = 0; y1 < n; ++y1)           for (int y2 = y1; y2 < n; ++y2)             if (2 <= y2 - y1 + x2 - x1) {               int r1 = dp1[(y2 + NX * (x2 + NX * (y1 + NX * x1)))],                   r2 = dp2[(y2 + NX * (x2 + NX * (y1 + NX * x1)))];               if (r1 == r2) continue;               int r = ask(x1, y1, x2, y2);               if (r1 == r)                 print(board1);               else                 print(board2);               return 0;             }     print(board1);     return 0;   }