#include <bits/stdc++.h>
using namespace std;
int n;
vector <string> query, actual, ans;
void print_query() {
cout << "?" << endl;
for (int i = 0; i < n; i++) {
cout << query[i] << endl;
}
}
void print_ans() {
cout << "!" << endl;
for (int i = 0; i < n; i++)
cout << ans[i] << endl;
}
int main() {
cin >> n;
ans = actual = query = vector <string> (n);
for (int i = 0; i < n; i++) {
ans[i].resize(n, '0');
actual[i].resize(n, '0');
query[i].resize(n, '0');
}
bool found_ans = false;
for (int i = 0; i < n && !found_ans; i++) {
int l = 0, r = n; // binary search to find a 'H'
while (l < r) {
int mid = (l + r) / 2;
if (mid == 0) {
query[i][0] = query[i][1] = '1';
print_query();
query[i][0] = query[i][1] = '0';
int res;
cin >> res;
if (res == n)
r = 0;
else if (res == n*2) {
l = r = 1;
} else { // res == n*2 - 1
query[i][0] = query[i][1] = query[i][2] = '1';
print_query();
query[i][0] = query[i][1] = query[i][2] = '0';
cin >> res;
if (res == n*2 + n-2) { // (i, 2) is vertical
query[i][0] = query[i][2] = '1';
print_query();
query[i][0] = query[i][2] = '0';
cin >> res;
if (res == 2 * n) {
l = r = 1;
} else
r = 0;
} else {
l = r = 2;
}
}
} else {
for (int j = 0; j <= mid; j++)
query[i][j] = '1';
for (int j = mid+1; j < n; j++)
query[i][j] = '0';
print_query();
int res;
cin >> res;
if (res == n * n) {
ans = query;
found_ans = true;
break;
} else if (res % n == 0 && res != n) {
// all the points from 0 to mid are vertical points.
l = mid + 1;
} else {
r = mid;
}
}
}
fill(query[i].begin(), query[i].end(), '0');
ans[i][r] = '1';
}
print_ans();
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |