#include <bits/stdc++.h>   using namespace std;   using pii = pair<int, int>;   using ll = long long;   pii operator+(pii& p1, pii& p2) {     return {p1.first + p2.first, p1.second + p2.second};   }   bool isvalidpos(pii& p, int n) {     return p.first >= 0 && p.first < n && p.second >= 0 && p.second < n;   }   int main() {     int n;     cin >> n;     vector<vector<int>> v1(n, vector<int>(n, -1));     vector<vector<int>> v2(n, vector<int>(n, -1));     v1[0][0] = 1;     v1[n - 1][n - 1] = 0;     v2[0][0] = 1;     v2[n - 1][n - 1] = 0;     queue<pii> q;     q.push({0, 0});     pii dyx[] = {{2, 0}, {0, 2}, {1, 1}};     while (!q.empty()) {       pii now = q.front();       q.pop();       for (int i = 0; i < 3; i++) {         pii nxt = now + dyx[i];         if (!isvalidpos(nxt, n)) continue;         if (v1[nxt.first][nxt.second] != -1) continue;         cout <<  ?   << now.first + 1 <<     << now.second + 1 <<                  << nxt.first + 1 <<     << nxt.second + 1 << endl;         cout.flush();         int res;         cin >> res;         if (res == 1)           v2[nxt.first][nxt.second] = v1[nxt.first][nxt.second] =               v1[now.first][now.second];         else           v2[nxt.first][nxt.second] = v1[nxt.first][nxt.second] =               1 - v1[now.first][now.second];         q.push(nxt);       }     }     v1[0][1] = 0;     v2[0][1] = 1;     q.push({0, 1});     while (!q.empty()) {       pii now = q.front();       q.pop();       for (int i = 0; i < 3; i++) {         pii nxt = now + dyx[i];         if (!isvalidpos(nxt, n)) continue;         if (v1[nxt.first][nxt.second] != -1) continue;         cout <<  ?   << now.first + 1 <<     << now.second + 1 <<                  << nxt.first + 1 <<     << nxt.second + 1 << endl;         cout.flush();         int res;         cin >> res;         if (res == 1) {           v2[nxt.first][nxt.second] = v2[now.first][now.second];           v1[nxt.first][nxt.second] = v1[now.first][now.second];         } else {           v2[nxt.first][nxt.second] = 1 - v2[now.first][now.second];           v1[nxt.first][nxt.second] = 1 - v1[now.first][now.second];         }         q.push(nxt);       }     }     for (int i = 1; i < n; i += 2) {       cout <<  ?   << i + 1 <<     << 1 <<     << i + 2 <<     << 2 << endl;       cout.flush();       int res;       cin >> res;       if (res == 1) {         v2[i][0] = v2[i + 1][1];         v1[i][0] = v1[i + 1][1];       } else {         v2[i][0] = 1 - v2[i + 1][1];         v1[i][0] = 1 - v1[i + 1][1];       }     }     bool answer = false;     pii dyx2[][4] = {{{0, 0}, {0, 1}, {0, 2}, {1, 2}},                      {{0, 0}, {0, 1}, {1, 1}, {1, 2}},                      {{0, 0}, {1, 0}, {1, 1}, {1, 2}}};     bool end = false;     for (int i = 0; i < n; i++) {       for (int j = 0; j < n; j++) {         bool palin1 = false;         bool palin2 = false;         pii now = {i, j};         for (int k1 = 0; k1 < 3; k1++) {           bool check = true;           for (int k2 = 0; k2 < 4; k2++) {             pii nxt = now + dyx2[k1][k2];             if (!isvalidpos(nxt, n)) {               check = false;               break;             }           }           if (!check) continue;           if (v1[now.first + dyx2[k1][0].first]                 [now.second + dyx2[k1][0].second] ==                   v1[now.first + dyx2[k1][3].first]                     [now.second + dyx2[k1][3].second] &&               v1[now.first + dyx2[k1][1].first]                 [now.second + dyx2[k1][1].second] ==                   v1[now.first + dyx2[k1][2].first]                     [now.second + dyx2[k1][2].second])             palin1 = true;           if (v2[now.first + dyx2[k1][0].first]                 [now.second + dyx2[k1][0].second] ==                   v2[now.first + dyx2[k1][3].first]                     [now.second + dyx2[k1][3].second] &&               v2[now.first + dyx2[k1][1].first]                 [now.second + dyx2[k1][1].second] ==                   v2[now.first + dyx2[k1][2].first]                     [now.second + dyx2[k1][2].second])             palin2 = true;         }         if (palin1 || palin2) {           cout <<  ?   << now.first + 1 <<     << now.second + 1 <<                    << now.first + 2 <<     << now.second + 3 << endl;           cout.flush();           int res;           cin >> res;           if (res == 1) {             if (palin1)               answer = true;             else               answer = false;           } else {             if (palin1)               answer = false;             else               answer = true;           }           end = true;           break;         }       }       if (end) break;     }     cout <<  !  << endl;     cout.flush();     for (int i = 0; i < n; i++) {       for (int j = 0; j < n; j++) {         if (answer)           cout << v1[i][j];         else           cout << v2[i][j];       }       cout << endl;       cout.flush();     }     return 0;   }