Untitled

 avatar
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