#include <bits/stdc++.h>
#define int long long
#define pb push_back
#define pii pair<int, int>
#define ff first
#define ss second
#define tii tuple<int, int, int>
// #define endl '\n'
using namespace std;
#define rsz resize
#define sz size
#define ass assign
#define all(x) (x).begin(),(x).end()
int n;
vector<pii> hor, ver;
vector<vector<int>> mat;
vector<vector<int>> sent;
// int find(int x, int y){
// }
int ask(){
cout << "?"<<endl;
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
cout << mat[i][j];
}
cout << endl;
}
int r; cin >> r;
return r;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n;
mat.rsz(n, vector<int>(n));
sent.rsz(n, vector<int>(n));
for(int i=0; i<n; i++){
mat[i][i]=1;
}
int rrr=ask();
if(rrr==n*n){
cout << "!"<<endl;
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
cout << mat[i][j];
}
cout << endl;
}
return 0;
}else{
for(int i=0; i<n; i++){
mat[i][i]=0;
}
}
srand(time(0));
vector<tuple<int, int, int, int>> ops = {{0,0,1,1}, {0,n-1,1,-1}, {n-1,0,-1,1}, {n-1,n-1,-1,-1}};
int ind=rand()%4;
int x=get<0>(ops[ind]), y=get<1>(ops[ind]);
int ax = get<2>(ops[ind]);
int ay = get<3>(ops[ind]);
mat[x][y]=1;
mat[x][y+ay]=1;
int r=ask();
if(r==n){
sent[x][y]=1;
sent[x][y+ay]=1;
}else if(r==2*n){
sent[x][y]=-1;
sent[x][y+ay]=-1;
}else{
mat[x][y+ay]=0;
mat[x][y+ay+ay]=1;
int r2=ask();
if(r2==n){
sent[x][y]=1;
sent[x][y+ay+ay]=1;
sent[x][y+ay]=-1;
}else if(r2==2*n){
sent[x][y]=-1;
sent[x][y+ay+ay]=-1;
sent[x][y+ay]=1;
}else{
mat[x][y]=0;
mat[x][y+ay]=1;
int r3=ask();
if(r3==n){
sent[x][y+ay]=1;
sent[x][y+ay+ay]=1;
sent[x][y]=-1;
}else if(r3==2*n){
sent[x][y+ay]=-1;
sent[x][y]=1;
sent[x][y+ay+ay]=-1;
}
}
}
mat[x][y]=0;
mat[x][y+ay]=0;
mat[x][y+ay+ay]=0;
if(sent[x][y]==1){
ver.pb({x, y});
}else{
hor.pb({x, y});
}
// cout << sent[0][0]<<endl;
// if(sent[0][1]==1){
// ver.pb({0, 1});
// }else if(sent[0][1]==-1){
// hor.pb({0, 1});
// }
// if(sent[0][2]==1){
// ver.pb({0, 2});
// }else if(sent[0][2]==-1){
// hor.pb({0, 2});
// }
while(!(x+ax>=n&&x+ax<0&&y+ay>=n&&y+ay<0)&&ver.sz()<n&&hor.sz()<n){
if(sent[x][y]==1){
if(sent[x+ax][y]==0){
mat[x][y]=1;
mat[x+ax][y]=1;
int r = ask();
mat[x][y]=0;
mat[x+ax][y]=0;
if(r==2*n){
sent[x+ax][y]=1;
ver.pb({x+ax, y});
}else{
sent[x+ax][y]=-1;
hor.pb({x+ax, y});
}
}else{
if(sent[x+ax][y]==1){
ver.pb({x+ax, y});
}else{
hor.pb({x+ax, y});
}
}
x+=ax;
}else{
if(sent[x][y+ay]==0){
mat[x][y]=1;
mat[x][y+ay]=1;
int r = ask();
mat[x][y]=0;
mat[x][y+ay]=0;
if(r==2*n){
sent[x][y+ay]=-1;
hor.pb({x, y+ay});
}else{
sent[x][y+ay]=1;
ver.pb({x, y+ay});
}
}else{
if(sent[x][y+ay]==1){
ver.pb({x, y+ay});
}else{
hor.pb({x, y+ay});
}
}
y+=ay;
}
}
cout << "!"<<endl;
if(ver.sz()==n){
for(auto [a, b]:ver){
mat[a][b]=1;
}
}else{
for(auto [a, b]:hor){
mat[a][b]=1;
}
}
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
cout << mat[i][j];
}
cout << endl;
}
}