#include <bits/stdc++.h>
using namespace std;
#define int long long int
int n;
int query(vector<string>&out)
{
cout<<"?"<<endl;
for(auto ii:out)
cout<<ii<<endl;
// cout<<endl;
int x;
cin>>x;
return x;
}
bool same(int x,int y,int i,int j)
{
vector<string>out(n,string(n,'0'));
out[x][y]='1';
out[i][j]='1';
return (query(out)%n==0);
}
int findh(int i,int type)
{
int l=0,r=n-1;
int ans=-1;
while(l<=r)
{
int mid=(l+r)/2;
vector<string>out(n,string(n,'0'));
for(int j=0;j<=mid;j++)
out[i][j]='1';
int c=query(out);
if(mid==0)
{
bool s=same(0,0,i,0);
if(s==(type=='V'))l=mid+1;
else
{
ans=mid;
r=mid-1;
}
}
else{
if(c==(mid+1)*n)
l=mid+1;
else
{
ans=mid;
r=mid-1;
}
}
}
return ans;
}
int findv(int j,int type)
{
int l=0,r=n-1;
int ans=-1;
while(l<=r)
{
int mid=(l+r)/2;
vector<string>out(n,string(n,'0'));
for(int i=0;i<=mid;i++)
out[i][j]='1';
int c=query(out);
if(mid==0)
{
bool s=same(0,0,0,j);
if(s==(type=='H'))l=mid+1;
else
{
ans=mid;
r=mid-1;
}
}
else{
if(c==(mid+1)*n)
l=mid+1;
else
{
ans=mid;
r=mid-1;
}
}
}
return ans;
}
vector<string> build(char type)
{
//find rows
vector<int>rows(n,0);
for(int i=0;i<n;i++)
{
vector<string> out(n, string(n, '0'));
for(int j=0;j<n;j++)
{
out[i][j]='1';
}
if(query(out)!=n*n)
rows[i]=1;
else
return out;
}
vector<int>col(n,0);
for(int j=0;j<n;j++)
{
vector<string> out(n, string(n, '0'));
for(int i=0;i<n;i++)
{
out[i][j]='1';
}
if(query(out)!=n*n)
col[j]=1;
else
return out;
}
vector<vector<int>>dp(n+1,vector<int>(n+1,1e18));
for(int i=n;i>=0;i--)
{
for(int j=n;j>=0;j--)
{
if(i==n||j==n)
{
dp[i][j]=0;
continue;
}
if(rows[i])
{
dp[i][j]=min(dp[i][j],dp[i+1][j]+1);
}
if(col[j])
{
dp[i][j]=min(dp[i][j],dp[i][j+1]+1);
}
}
}
vector<string>out(n,string(n,'0'));
int i=0,j=0;
while (i<n&&j<n) {
// bool ok=false;
if (rows[i]==1&&dp[i][j]==dp[i+1][j]+1) {
int J=findh(i,type);
out[i][J]='1';
i++;
}
else
{
int I=findv(j,type);
out[I][j]='1';
j++;
}
}
// }
return out;
}
int32_t main() {
cin>>n;
vector<vector<int>>grid(n,vector<int>(n));
//assume 0,0 as something
vector<char>assume={'H','V'};
for(char t:assume)
{
//build a grid based on how it responds do that
vector<string> out=build(t);
//build a dp to check our ans and to output positions
//rebuild
//vector<string>out=recons(grid,dp);
//test
if(query(out)==n*n)
{
cout<<"!"<<endl;
for(auto i:out)
cout<<i<<endl;
cout<<endl;
return 0;
}
}
}