제출 #396951

#제출 시각아이디문제언어결과실행 시간메모리
396951KoDNautilus (BOI19_nautilus)C++17
100 / 100
200 ms640 KiB
#include <bits/stdc++.h>

template <class T>
using Vec = std::vector<T>;

using Bit = std::bitset<500>;

int main() {
    int R, C, M;
    std::cin >> R >> C >> M;
    Vec<Bit> grid_row(R);
    for (int i = 0; i < R; ++i) {
        for (int j = 0; j < C; ++j) {
            char c;
            std::cin >> c;
            if (c == '.') {
                grid_row[i].set(j);
            }
        }
    }
    auto row = grid_row;
    while (M--) {
        char c;
        std::cin >> c;
        if (c == 'N') {
            for (int i = 0; i < R - 1; ++i) {
                row[i] = row[i + 1] & grid_row[i];
            }
            row[R - 1] = Bit();
        }
        if (c == 'S') {
            for (int i = R - 1; i > 0; --i) {
                row[i] = row[i - 1] & grid_row[i];
            }
            row[0] = Bit();
        }
        if (c == 'E') {
            for (int i = 0; i < R; ++i) {
                row[i] = (row[i] << 1) & grid_row[i];
            }
        }
        if (c == 'W') {
            for (int i = 0; i < R; ++i) {
                row[i] = (row[i] >> 1) & grid_row[i];
            }
        }
        if (c == '?') {
            Vec<Bit> nrow(R);
            for (int i = 0; i < R; ++i) {
                nrow[i] |= row[i] >> 1;
                nrow[i] |= row[i] << 1;
                if (i > 0) nrow[i] |= row[i - 1];
                if (i + 1 < R) nrow[i] |= row[i + 1];
                nrow[i] &= grid_row[i];
            }
            row = std::move(nrow);
        }
    }
    int ans = 0;
    for (int i = 0; i < R; ++i) {
        ans += row[i].count();
    }
    std::cout << ans << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...