#include <bits/stdc++.h>
using namespace std;
char get(bool t, char a) {
  if (t)
    return a;
  else
    switch (a) {
      case '0':
        return '1';
      case '1':
        return '0';
      case 'x':
        return '!';
      case '!':
        return 'x';
      default:
        return 'E';
    }
}
bool Horizontal(char a[2][3]) {
  if (a[0][0] != a[1][2]) return 0;
  return (a[0][1] == a[1][1] || a[1][0] == a[1][1] || a[0][1] == a[0][2]);
}
bool Vertical(char a[3][2]) {
  if (a[0][0] != a[2][1]) return 0;
  return (a[1][0] == a[1][1] || a[0][1] == a[1][1] || a[1][0] == a[2][0]);
}
pair<bool, bool> TEST(long long n, char** a, long long x, long long y, bool h) {
  pair<bool, bool> ans;
  if (h) {
    char b[2][3];
    for (long long i = 0, max_i = 2; i < max_i; ++i)
      for (long long j = 0, max_i = 3; j < max_i; ++j)
        switch (a[y + i][x + j]) {
          case 'x':
          case '0':
            b[i][j] = '0';
            break;
          case '!':
          case '1':
            b[i][j] = '1';
            break;
        }
    ans.first = Horizontal(b);
    for (long long i = 0, max_i = 2; i < max_i; ++i)
      for (long long j = 0, max_i = 3; j < max_i; ++j)
        switch (a[y + i][x + j]) {
          case '!':
          case '0':
            b[i][j] = '0';
            break;
          case 'x':
          case '1':
            b[i][j] = '1';
            break;
        }
    ans.second = Horizontal(b);
  } else {
    char b[3][2];
    for (long long i = 0, max_i = 3; i < max_i; ++i)
      for (long long j = 0, max_i = 2; j < max_i; ++j)
        switch (a[y + i][x + j]) {
          case 'x':
          case '0':
            b[i][j] = '0';
            break;
          case '!':
          case '1':
            b[i][j] = '1';
            break;
        }
    ans.first = Vertical(b);
    for (long long i = 0, max_i = 3; i < max_i; ++i)
      for (long long j = 0, max_i = 2; j < max_i; ++j)
        switch (a[y + i][x + j]) {
          case '!':
          case '0':
            b[i][j] = '0';
            break;
          case 'x':
          case '1':
            b[i][j] = '1';
            break;
        }
    ans.second = Vertical(b);
  }
  return ans;
}
char getX(long long n, char** a) {
  char ans = 'E';
  for (long long i = 0, max_i = n - 2; i < max_i; ++i)
    for (long long j = 0, max_i = n - 1; j < max_i; ++j) {
      auto t = TEST(n, a, j, i, 0);
      if (t.first != t.second && ans == 'E') {
        cout << "? " << i + 1 << " " << j + 1 << " " << i + 3 << " " << j + 2
             << endl;
        bool p;
        cin >> p;
        if (p == t.first)
          ans = '0';
        else
          ans = '1';
      }
    }
  for (long long i = 0, max_i = n - 1; i < max_i; ++i)
    for (long long j = 0, max_i = n - 2; j < max_i; ++j) {
      auto t = TEST(n, a, j, i, 1);
      if (t.first != t.second && ans == 'E') {
        cout << "? " << i + 1 << " " << j + 1 << " " << i + 2 << " " << j + 3
             << endl;
        bool p;
        cin >> p;
        if (p == t.first)
          ans = '0';
        else
          ans = '1';
      }
    }
  return ans;
}
int main(int argc, char** argv) {
  long long n;
  cin >> n;
  char** a = new char*[n];
  for (long long i = 0, max_i = n; i < max_i; ++i) a[i] = new char[n];
  a[0][0] = '1';
  for (long long i = 0, max_i = n; i < max_i; ++i) {
    for (long long j = 0, max_i = n; j < max_i; ++j) {
      if (i == 0 && j == 0)
        continue;
      else if ((i + j) % 2 == 0) {
        if (i == 0) {
          cout << "? " << i + 1 << " " << j - 1 << " " << i + 1 << " " << j + 1
               << endl;
          bool t;
          cin >> t;
          a[i][j] = get(t, a[i][j - 2]);
        } else if (j == 0) {
          cout << "? " << i - 1 << " " << j + 1 << " " << i + 1 << " " << j + 1
               << endl;
          bool t;
          cin >> t;
          a[i][j] = get(t, a[i - 2][j]);
        } else {
          cout << "? " << i << " " << j << " " << i + 1 << " " << j + 1 << endl;
          bool t;
          cin >> t;
          a[i][j] = get(t, a[i - 1][j - 1]);
        }
      } else {
        if (j == 1 && i == 0)
          a[i][j] = 'x';
        else if (j == 1) {
          cout << "? " << i - 1 << " " << j + 1 << " " << i + 1 << " " << j + 1
               << endl;
          bool t;
          cin >> t;
          a[i][j] = get(t, a[i - 2][j]);
        } else if (i == 0) {
          cout << "? " << i + 1 << " " << j - 1 << " " << i + 1 << " " << j + 1
               << endl;
          bool t;
          cin >> t;
          a[i][j] = get(t, a[i][j - 2]);
        } else if (j != 0) {
          cout << "? " << i << " " << j << " " << i + 1 << " " << j + 1 << endl;
          bool t;
          cin >> t;
          a[i][j] = get(t, a[i - 1][j - 1]);
        }
      }
    }
  }
  for (long long i = 1; i < n; i += 2) {
    cout << "? " << i + 1 << " " << 1 << " " << i + 1 << " " << 3 << endl;
    bool t;
    cin >> t;
    a[i][0] = get(t, a[i][2]);
  }
  char x = getX(n, a);
  for (long long i = 0, max_i = n; i < max_i; ++i) {
    for (long long j = 0, max_i = n; j < max_i; ++j) cerr << a[i][j];
    cerr << "\n";
  }
  cerr << "\n\n";
  cout << "!";
  for (long long i = 0, max_i = n; i < max_i; ++i) {
    cout << endl;
    for (long long j = 0, max_i = n; j < max_i; ++j) {
      switch (a[i][j]) {
        case '1':
          cout << 1;
          break;
        case '0':
          cout << 0;
          break;
        case 'x':
          cout << x;
          break;
        case '!':
          cout << get(0, x);
          break;
        default:
          cout << "E";
      }
    }
  }
  return 0;
}
