#include <bits/stdc++.h>   using namespace std;   const int N = 55;   int read() {     int w = 0, f = 0;     char c = getchar();     while ((c <  0  || c >  9 ) && c !=  - ) c = getchar();     if (c ==  - ) f = 1, c = getchar();     while (c >=  0  && c <=  9 ) w = w * 10 + c -  0 , c = getchar();     return f ? -w : w;   }   int n;   int a[N][N], b[N][N];   int ask(int x1, int y1, int x2, int y2) {     printf( ? %d %d %d %d n , x1, y1, x2, y2);     fflush(stdout);     int tmp;     scanf( %d , &tmp);     return tmp;   }   void Ans(int res) {     puts( ! );     if (res == 1) {       for (int i = 1; i <= n; ++i)         for (int j = 1; j <= n; ++j) {           printf( %d , a[i][j]);           if (j == n) puts(  );         }     } else {       for (int i = 1; i <= n; ++i) {         for (int j = 1; j <= n; ++j) {           printf( %d , b[i][j]);           if (j == n) puts(  );         }       }     }   }   bool check(vector<int>& v) {     vector<int> tmp = v;     reverse(tmp.begin(), tmp.end());     for (size_t i = 0; i < v.size(); ++i)       if (v[i] != tmp[i]) return 0;     return 1;   }   int tx = -1, ty, sx, sy;   bool r1, r2;   vector<int> p1, p2;   void work(int t, int x, int y) {     if (!t) {       bool b1 = check(p1), b2 = check(p2);       if (b1 != b2) {         tx = x, ty = y;         r1 = b1, r2 = b2;       }       return;     }     if (tx != -1) return;     if (x + 1 <= n) {       p1.push_back(a[x + 1][y]);       p2.push_back(b[x + 1][y]);       work(t - 1, x + 1, y);       p1.pop_back();       p2.pop_back();       if (tx != -1) return;     }     if (y + 1 <= n) {       p1.push_back(a[x][y + 1]);       p2.push_back(b[x][y + 1]);       work(t - 1, x, y + 1);       p1.pop_back();       p2.pop_back();     }   }   int main() {     memset(a, -1, sizeof a);     memset(b, -1, sizeof b);     n = read();     for (int i = 1; i <= n; i += 2) {       for (int j = 1; j <= n; j += 2) {         if (i == 1 && j == 1)           a[i][j] = 1;         else {           if (j > 2)             a[i][j] = ask(i, j - 2, i, j) ^ a[i][j - 2] ^ 1;           else             a[i][j] = ask(i - 2, j, i, j) ^ a[i - 2][j] ^ 1;         }         b[i][j] = a[i][j];       }     }     for (int i = 2; i <= n; i += 2) {       for (int j = 2; j <= n; j += 2) {         if (i == 2 && j == 2)           a[2][2] = ask(1, 1, 2, 2);         else {           if (j > 2)             a[i][j] = ask(i, j - 2, i, j) ^ a[i][j - 2] ^ 1;           else             a[i][j] = ask(i - 2, j, i, j) ^ a[i - 2][j] ^ 1;         }         b[i][j] = a[i][j];       }     }     for (int i = 1; i <= n; i += 2) {       for (int j = 2; j <= n; j += 2) {         if (i == 1 && j == 2)           a[1][2] = 0;         else {           if (j > 2)             a[i][j] = ask(i, j - 2, i, j) ^ a[i][j - 2] ^ 1;           else             a[i][j] = ask(i - 2, j, i, j) ^ a[i - 2][j] ^ 1;         }         b[i][j] = a[i][j] ^ 1;       }     }     for (int i = 2; i <= n; i += 2) {       for (int j = 3; j <= n; j += 2) {         if (i == 2 && j == 3)           a[2][3] = ask(1, 2, 2, 3) ^ a[1][2] ^ 1;         else {           if (j > 3)             a[i][j] = ask(i, j - 2, i, j) ^ a[i][j - 2] ^ 1;           else             a[i][j] = ask(i - 2, j, i, j) ^ a[i - 2][j] ^ 1;         }         b[i][j] = a[i][j] ^ 1;       }     }     for (int i = 2; i <= n; i += 2) {       a[i][1] = ask(i, 1, i, 3) ^ a[i][3] ^ 1;       b[i][1] = a[i][1] ^ 1;     }     for (int t = 3; tx == -1; ++t) {       for (int i = 1; i <= n; ++i) {         for (int j = 1; j <= n; ++j) {           p1.clear(), p2.clear();           p1.push_back(a[i][j]), p2.push_back(b[i][j]);           work(t, i, j);           if (tx != -1) {             sx = i, sy = j;             break;           }         }         if (tx != -1) break;       }     }     int tmp = ask(sx, sy, tx, ty);     Ans(tmp == r1);     return 0;   }