Submission #1151816

#TimeUsernameProblemLanguageResultExecution timeMemory
1151816Jawad_Akbar_JJLight Bulbs (EGOI24_lightbulbs)C++20
60.70 / 100
230 ms468 KiB
#include <iostream>
#include <vector>

using namespace std;
int n, a[105], col[105][105], ans[105], seen[100000];

int print(){
	cout<<"?\n";
	for (int i=1;i<=n;i++){
		for (int j=1;j<=n;j++)
			cout<<col[i][j], col[i][j] = 0;
		if (i < n)
			cout<<'\n';
		else
			cout<<endl;
	}
	cin>>col[0][0];
	return col[0][0];
}

int get(pair<int,int> A, pair<int,int> B){
	col[A.first][A.second] = 1;
	col[B.first][B.second] = 1;
	return print();
}

int get(int rw, int l, int r){
	for (int i=l;i<=r;i++)
		col[rw][i] = 1;
	return print();
}

int main(){
	cin>>n;

	for (int i=2;i<=n;i++){
		ans[i] = get({1, 1}, {i, 1});
		seen[ans[i]] = 1;
		if (ans[i] % n != 0)
			a[i] = 1;
	}

	if (seen[n] or (seen[2 * n] == 0 and get({2, 1}, {3, 1}) == 2 * n)){
		for (int i=1;i<=n;i++)
			a[i] ^= 1;
	}

	vector<pair<int, int>> vec;
	for (int i=1;i<=n;i++){
		if (a[i] == 0){
			vec.push_back({i, 1});
			continue;
		}

		int l = 1, r = n + 1;
		while (l + 1 < r){
			int mid = (l + r) / 2;
			if (get(i, 1, mid) == mid * n)
				l = mid;
			else
				r = mid;
		}
		if (l == n){
			vec.clear();
			for (int j=1;j<=n;j++)
				vec.push_back({i, j});
			break;
		}
		vec.push_back({i, l + 1});
	}
	for (auto [i, j] : vec)
		col[i][j] = 1;
	
	cout<<"!\n";
	for (int i=1;i<=n;i++){
		for (int j=1;j<=n;j++)
			cout<<col[i][j];
		if (i < n)
			cout<<'\n';
		else
			cout<<endl;
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...