Untitled
unknown
c_cpp
a year ago
2.0 kB
13
Indexable
#include <bits/stdc++.h>
using namespace std;
#define M 900
#define mask bitset<M>
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int n;
cin >> n;
mask to_find;
for (int i = 0; i < n * n; i++) {
char c;
cin >> c;
to_find[i] = (c == '.');
}
auto g = [&](int x, int y) { // 0-based
return x * n + y;
};
auto construct_point = [&](int i, int j) {
vector<int> dx = { 1, 0, -1, 0 };
vector<int> dy = { 0, 1, 0, -1 };
mask res;
for (int k = 0; k < 4; k++) {
int x = i + dx[k], y = j + dy[k];
if (x < 0 || x >= n) continue;
if (y < 0 || y >= n) continue;
res[g(x, y)] = 1;
}
res[g(i, j)] = 1;
return res;
};
auto one_point = [&](int i, int j) {
mask res;
res[g(i, j)] = 1;
return res;
};
pair<mask, mask> basis[M];
vector<int> exists(M);
auto insert = [&](int i, int j) {
mask X = construct_point(i, j);
mask Y = one_point(i, j);
for (int k = 0; k < M; k++) {
if (!X[k]) continue;
if (!exists[k]) {
exists[k] = 1;
basis[k] = { X, Y };
return;
}
X ^= basis[k].first;
Y ^= basis[k].second;
}
};
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
insert(i, j);
mask taken;
taken.reset();
for (int k = 0; k < M; k++) {
if (!to_find[k]) continue;
if (!exists[k]) {
cout << "NO\n";
return 0;
}
to_find ^= basis[k].first;
taken ^= basis[k].second;
}
cout << "YES\n";
cout << taken.count() << "\n";
for (int i = 0; i < n * n; i++)
if (taken[i]) {
int x = i / n, y = i % n;
cout << x + 1 << " " << y + 1 << "\n";
}
}Editor is loading...
Leave a Comment