Untitled
unknown
c_cpp
a year ago
2.0 kB
5
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