#include <bits/stdc++.h>   using namespace std;   const int maxn = 50 + 10;   int a[maxn][maxn];   int dx[10] = {0, 2, 1, 0, -1, -2};   int dy[10] = {2, 0, 1, -2, -1, 0};   int sx, sy;   struct Node {     int x, y;   };   int main() {     int n;     scanf( %d , &n);     memset(a, -1, sizeof(a));     a[1][1] = 1;     a[n][n] = 0;     queue<Node> q;     q.push((Node){1, 1});     while (!q.empty()) {       Node tmp = q.front();       q.pop();       int x = tmp.x, y = tmp.y;       for (int i = 0; i < 3; i++) {         int tx = x + dx[i], ty = y + dy[i];         if (tx < 1 || ty < 1 || tx > n || ty > n) continue;         if (a[tx][ty] != -1) continue;         cout <<  ?  <<     << x <<     << y <<     << tx <<     << ty <<   n ;         cout.flush();         int t;         cin >> t;         a[tx][ty] = t ? a[x][y] : a[x][y] ^ 1;         q.push((Node){tx, ty});       }     }     for (int i = 1; i <= n; i++) {       if (i + 2 > n) break;       for (int j = 1; j <= n; j++) {         if (j + 2 > n) break;         if (a[i][j] == 1 && a[i + 2][j + 2] == 0) {           sx = i, sy = j;           break;         }       }     }     int tmp;     cout <<  ?  <<     << sx <<     << sy + 1 <<     << sx + 1 <<     << sy + 2          <<   n ;     cout.flush();     cin >> tmp;     if (tmp) {       cout <<  ?  <<     << sx <<     << sy <<     << sx + 1 <<     << sy + 2            <<   n ;       cout.flush();       cin >> tmp;       if (tmp) {         a[sx][sy + 1] = a[sx + 1][sy + 2] = 1;       } else {         if (a[sx][sy + 2] == 1) {           a[sx][sy + 1] = a[sx + 1][sy + 2] = 0;         } else {           cout <<  ?  <<     << sx <<     << sy + 1 <<     << sx + 2 <<                    << sy + 2 <<   n ;           cout.flush();           cin >> tmp;           if (tmp) {             a[sx][sy + 1] = a[sx + 1][sy + 2] = 0;           } else {             a[sx][sy + 1] = a[sx + 1][sy + 2] = 1;           }         }       }     } else {       cout <<  ?  <<     << sx <<     << sy <<     << sx + 1 <<     << sy + 2            <<   n ;       cout.flush();       cin >> tmp;       if (tmp) {         a[sx][sy + 1] = 0;         a[sx + 1][sy + 2] = 1;       } else {         cout <<  ?  <<     << sx <<     << sy + 1 <<     << sx + 2 <<                  << sy + 2 <<   n ;         cout.flush();         cin >> tmp;         if (tmp) {           a[sx][sy + 1] = 0;           a[sx + 1][sy + 2] = 1;         } else {           a[sx][sy + 1] = 1;           a[sx + 1][sy + 2] = 0;         }       }     }     q.push((Node){sx, sy + 1});     while (!q.empty()) {       Node tmp = q.front();       q.pop();       int x = tmp.x, y = tmp.y;       for (int i = 0; i < 6; i++) {         int tx = x + dx[i], ty = y + dy[i];         if (tx < 1 || ty < 1 || tx > n || ty > n) continue;         if (a[tx][ty] != -1) continue;         if (i < 3)           cout <<  ?  <<     << x <<     << y <<     << tx <<     << ty <<   n ;         else           cout <<  ?  <<     << tx <<     << ty <<     << x <<     << y <<   n ;         cout.flush();         int t;         cin >> t;         a[tx][ty] = t ? a[x][y] : a[x][y] ^ 1;         q.push((Node){tx, ty});       }     }     cout <<  !  <<   n ;     for (int i = 1; i <= n; i++) {       for (int j = 1; j <= n; j++) {         cout << a[i][j];       }       cout <<   n ;     }     cout <<   n ;     return 0;   }