#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=0;
int bg = rand()%n;
int x=(get<0>(ops[ind])+bg)%n, y=get<1>(ops[ind]);
int ax = get<2>(ops[ind]);
int ay = get<3>(ops[ind]);
int a=x, b=y;
for(int i=0; i<n; i++){
// cout << a << " "<<b<<endl;
mat[a][b]=1;
a+=ax;
a%=n;
b+=ay;
}
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{
a=x; b=y;
for(int i=0; i<n; i++){
mat[a][b]=0;
a+=ax;
a%=n;
b+=ay;
}
}
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>=n&&(x+ax)%n<0&&y+ay>=n&&y+ay<0)&&ver.sz()<n&&hor.sz()<n){
if(sent[x][y]==1){
if(sent[(x+ax)%n][y]==0){
mat[x][y]=1;
mat[(x+ax)%n][y]=1;
int r = ask();
mat[x][y]=0;
mat[(x+ax)%n][y]=0;
if(r==2*n){
sent[(x+ax)%n][y]=1;
ver.pb({(x+ax)%n, y});
}else{
sent[(x+ax)%n][y]=-1;
hor.pb({(x+ax)%n, y});
}
}else{
if(sent[(x+ax)%n][y]==1){
ver.pb({(x+ax)%n, y});
}else{
hor.pb({(x+ax)%n, y});
}
}
x=(x+ax)%n;
}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;
}
}