Thứ Năm, 5 tháng 1, 2023

bomb c++

#include <cstdio>
#include <cstring>
#include <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;

const int lim = 35,
          dx[4] = {0, 1, 0, -1},
          dy[4] = {1, 0, -1, 0};

int m, n, a[lim][lim], ans;

int s[lim * lim][lim * lim], k;

void solve(int m, int n)
{
    int *r[lim * lim], v[lim * lim];
    memset(v, 0, sizeof(v));
    for (int i = 0; i < m; ++i)
    {
        r[i] = s[i];
        while (r[i][v[i]] == 0 && v[i] < n) ++v[i];
    }
    for (int i = 0; i < m - 1; ++i)
        for (int j = 0; j < m - i - 1; ++j)
            if (v[j] > v[j + 1])
            {
                swap(r[j], r[j + 1]);
                swap(v[j], v[j + 1]);
            }
    for (int i = 0; i < m - 1 && v[i] < n; ++i)
        while (v[i] == v[i + 1])
        {
            int p = i + 1;
            for (int j = 0; j < n; ++j)
            {
                r[p][j] -= r[i][j];
                if (r[p][j] < 0) r[p][j] = 1;
            }

            while (r[p][v[p]] == 0 && v[p] < n) ++v[p];
            while (p < m - 1 && v[p] > v[p + 1])
            {
                swap(r[p], r[p + 1]);
                swap(v[p], v[p + 1]);
                ++p;
            }
        }
    bool chk[lim * lim];
    memset(chk, 0, sizeof(chk));
    for (int i = 0; i < m; ++i)
        if (v[i] != n - 1) chk[v[i]] = true;
        else
        {
            ans -= lim * lim;
            return;
        }
    for (int j = 0; j < n - 1; ++j)
        ans += !chk[j];
}

long long res[lim] = {1};
const long long mod = 1e18;

void print_ans()
{
    while (ans--)
    {
        bool mem = 0;
        for (int i = 0; i < lim; ++i)
        {
            (res[i] <<= 1) += mem;
            if (res[i] == 0) break;
            else if (res[i] >= mod)
            {
                res[i] -= mod;
                mem = 1;
            }
            else mem = 0;
        }
    }
    int i = lim - 1;
    while (res[i] == 0) --i;
    cout << res[i--];
    while (i >= 0)
        cout << setw(18) << setfill('0') << res[i--];
}

int main()
{
    freopen("BOMB.INP", "r", stdin);
    freopen("BOMB.OUT", "w", stdout);
    cin >> m >> n;
    for (int i = 0; i < m; ++i)
        for (int j = 0; j < n; ++j)
        {
            cin >> a[i][j];
            if ((i ^ j) % 2 == 1 && a[i][j] != -1)
            {
                for (int p = 0; p < 4; ++p)
                {
                    int x = i + dx[p], y = j + dy[p];
                    if (x >= 0 && x < m && y >= 0 && y < n)
                        s[k][x * n + y >> 1] = 1;
                }
                s[k++][n * m + 1 >> 1] = a[i][j];
            }
        }
    solve(k, (n * m + 1 >> 1) + 1); k = 0;
    memset(s, 0, sizeof(s));
    for (int i = 0; i < m; ++i)
        for (int j = 0; j < n; ++j)
            if ((i ^ j) % 2 == 0 && a[i][j] != -1)
            {
                for (int p = 0; p < 4; ++p)
                {
                    int x = i + dx[p], y = j + dy[p];
                    if (x >= 0 && x < m && y >= 0 && y < n)
                        s[k][x * n + y >> 1] = 1;
                }
                s[k++][n * m >> 1] = a[i][j];
            }
    solve(k, (n * m >> 1) + 1);
    if (ans >= 0) print_ans();
    else cout << 0;
}

Không có nhận xét nào:

Đăng nhận xét

Lưu ý: Chỉ thành viên của blog này mới được đăng nhận xét.