113862024-08-31 01:34:46kukkermanÜtős helyzet (75 pont)cpp17Accepted 75/753ms528 KiB
#include <iostream>
#include <vector>

struct Lepes {
    int t, x, y;
};

std::vector<Lepes> beolvas(std::istream &be) {
    int n;
    be >> n;

    std::vector<Lepes> lepesek(n);
    for (auto &l : lepesek) {
        be >> l.t >> l.x >> l.y;
    }

    return lepesek;
}

const int kBastya = 5;
const int kKiralyno = 6;

// 0 - ures, tamadas alatt nem allo mezo
// 1 .. 4 - ures, de tamadas alatt allo mezo
// 5 - bastya
// 6 - kiralyno
using Sakktabla = std::vector<std::vector<int>>;

bool ut_masikat(int babu, int sor, int oszlop, const Sakktabla &tabla) {
    for (int i = 0; i < 8; i++) {
        if (tabla[sor][i] >= kBastya || tabla[i][oszlop] >= kBastya) {
            return true;
        }
    }

    if (babu == kKiralyno) {
        int elso   = std::min(sor, oszlop);
        int utolso = std::min(7 - sor, 7 - oszlop);
        for (int i = -elso; i <= utolso; i++) {
            if (tabla[sor + i][oszlop + i] >= kBastya) {
                return true;
            }
        }

        elso = std::min(7 - sor, oszlop);
        utolso = std::min(sor, 7 - oszlop);
        for (int i = -elso; i <= utolso; i++) {
            if (tabla[sor - i][oszlop + i] >= kBastya) {
                return true;
            }
        }
    }

    return false;
}

const bool kLetesz = true;
const bool kLevesz = false;

void modosit(int babu, int sor, int oszlop, bool letesz, Sakktabla &tabla) {
    const int valtozas = letesz ? 1 : -1;

    for (int i = 0; i < 8; i++) {
        tabla[sor][i] += valtozas;
        tabla[i][oszlop] += valtozas;
    }

    if (babu == kKiralyno) {
        int elso   = std::min(sor, oszlop);
        int utolso = std::min(7 - sor, 7 - oszlop);
        for (int i = -elso; i <= utolso; i++) {
            tabla[sor + i][oszlop + i] += valtozas;
        }

        elso   = std::min(7 - sor, oszlop);
        utolso = std::min(sor, 7 - oszlop);
        for (int i = -elso; i <= utolso; i++) {
            tabla[sor - i][oszlop + i] += valtozas;
        }
    }

    tabla[sor][oszlop] = letesz ? babu : 0;
}

void feldolgoz(const std::vector<Lepes> &lepesek) {
    using std::cout;

    Sakktabla tabla(8, std::vector<int>(8, 0));

    for (const auto &lepes : lepesek) {
        const auto sor = lepes.x - 1;
        const auto oszlop = lepes.y - 1;

        if (lepes.t == 3) {
            modosit(tabla[sor][oszlop], sor, oszlop, kLevesz, tabla);
            cout << "-\n";

        } else {
            const auto babu = lepes.t == 1 ? kBastya : kKiralyno;

            if (tabla[sor][oszlop] == 0 && !ut_masikat(babu, sor, oszlop, tabla)) {
                modosit(babu, sor, oszlop, kLetesz, tabla);
                cout << "IGEN\n";

            } else {
                cout << "NEM\n";
            }
        }
    }
}

int main() {
    const auto lepesek = beolvas(std::cin);
    feldolgoz(lepesek);

    return 0;
}
SubtaskSumTestVerdictTimeMemory
base75/75
1Accepted0/03ms500 KiB
2Accepted0/03ms488 KiB
3Accepted2/23ms360 KiB
4Accepted2/23ms360 KiB
5Accepted3/33ms512 KiB
6Accepted3/33ms360 KiB
7Accepted5/53ms504 KiB
8Accepted6/63ms508 KiB
9Accepted6/63ms504 KiB
10Accepted6/63ms368 KiB
11Accepted6/63ms376 KiB
12Accepted6/63ms396 KiB
13Accepted6/63ms400 KiB
14Accepted6/63ms360 KiB
15Accepted6/63ms360 KiB
16Accepted6/63ms360 KiB
17Accepted6/63ms528 KiB