#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for (int i = a; i <= b; i++)
#define per(i,a,b) for (int i = a; i >= b; i--)
#define pii pair<int,int>
#define pb push_back
#define all(v) (v).begin(), (v).end()
const int MAXN = 110;
int a[MAXN][MAXN],val[MAXN][MAXN], h[MAXN], v[MAXN],n;
mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
void print(char ch) {
cout << ch << " "<< endl;
rep(i,1,n) {
string s;
rep(j,1,n) {
s+=(char)(a[i][j]+'0');
}
cout << s << endl;
}
}
int query() {
print('?');
int ans; cin >> ans;
return ans;
}
void flip(const vector<int> ls) {
assert(ls.size()%2==0);
rep(i,0,ls.size()-1) {
int x = ls[i], y = ls[i+1];
a[x][y] = 1-a[x][y];
i++;
}
}
void flip(int x, int y) {
a[x][y] = 1-a[x][y];
}
void zero(const vector<int> ls) {
assert(ls.size()%2==0);
rep(i,0,ls.size()-1) {
int x = ls[i], y = ls[i+1];
a[x][y] = 0;
i++;
}
}
void zero(int x, int y) {
a[x][y] = 0;
}
// val-0 -> H
// val-1 -> V
int main() {
cin >> n;
rep(i,1,n) rep(j,1,n) val[i][j] = -1;
flip({1,1,1,2});
int x = query();
if(x == n) {
val[1][1] = val[1][2] = 0;
}
else if(x == 2*n) {
val[1][1] = val[1][2] = 1;
}
else {
flip({1,1,1,3});
x = query();
if(x==n) val[1][2] = val[1][3] = 0;
else if (x==2*n) val[1][2] = val[1][3] = 1;
flip({1,1,1,2});
x = query();
if(x==n) val[1][1] = val[1][3] = 0;
else if (x==2*n) val[1][1] = val[1][3] = 1;
if(val[1][1] == -1) val[1][1] = 1-val[1][2];
if(val[1][2] == -1) val[1][2] = 1-val[1][1];
}
zero({1,1,1,2,1,3});
flip(1,1);
int i = 1, j = 1;
while(i<=n && j <= n) {
if(val[i][j]==-1) {
flip(i,j);
int x = query();
if(x==2*n) val[i][j] = val[1][1];
else val[i][j] = 1-val[1][1];
flip(i,j);
}
if(val[i][j]) {
v[j] = i;
j++;
} else {
h[i] = j;
i++;
}
}
zero(1,1);
if(i>n) {
rep(i,1,n) flip(i,h[i]);
print('!');
} else {
rep(j,1,n) flip(v[j], j);
print('!');
}
return 0;
}