#include <iostream>
#include <vector>
#include <string>
using namespace std;
int ask(int n, const vector<string>& grid) {
cout << "?" << endl;
for (int i = 0; i < n; i++) {
cout << grid[i] << endl;
}
int res;
cin >> res;
if (res == -1) exit(0);
return res;
}
int main() {
int n;
cin >> n;
vector<int> selected_col(n, -1);
bool all_rows_have_H = true;
for (int i = 0; i < n; i++) {
vector<string> row_grid(n, string(n, '0'));
for (int j = 0; j < n; j++) row_grid[i][j] = '1';
int res = ask(n, row_grid);
if (res == n * n) {
cout << "!" << endl;
for (int k = 0; k < n; k++) {
string output_row(n, '0');
output_row[k] = '1';
}
for (int k = 0; k < n; k++) {
string r(n, '0');
r[k] = '1';
cout << r << endl;
}
return 0;
}
int low = 0, high = n - 1, found_j = 0;
while (low <= high) {
int mid = low + (high - low) / 2;
vector<string> test_grid(n, string(n, '0'));
for (int j = low; j <= mid; j++) test_grid[i][j] = '1';
int current_res = ask(n, test_grid);
if (current_res % n != 0 || (current_res == n && (mid-low+1) == 1)) {
found_j = mid;
if (low == high) break;
high = mid;
} else {
low = mid + 1;
}
}
selected_col[i] = found_j;
}
cout << "!" << endl;
for (int i = 0; i < n; i++) {
string final_row(n, '0');
if (selected_col[i] != -1) final_row[selected_col[i]] = '1';
cout << final_row << endl;
}
return 0;
}