제출 #529967

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

std::bitset<505> map[505];
std::bitset<505> pos[505];
std::bitset<505> _pos[505];
std::vector<char> cmds;

int main ()
{
    int R, C, M;
    std::cin >> R >> C >> M;
    for(int row = 1; row <= R; row++)
        for(int col = C; col >= 1; col--)
        {
            char c = ' ';
            while(c != '#' && c != '.')
                c = std::getchar();
            map[row][col] = (c == '#') ? 0 : 1;
            pos[row][col] = (c == '#') ? 0 : 1;
        }
    for(int i = 0; i < M; i++)
    {
        char c = ' ';
        while(c != 'N' && c != 'E' && c != 'S' && c != 'W' && c != '?')
            c = std::getchar();
        cmds.push_back(c);
    }

    for(int cmd = 0; cmd < M; cmd++)
    {
        switch(cmds[cmd])
        {
            case 'N':
                for(int i = 1; i <= R; i++)
                    pos[i] = pos[i+1] & map[i];
            break;

            case 'E':
                for(int i = 1; i <= R; i++)
                    pos[i] = (pos[i] >> 1) & map[i];
            break;

            case 'S':
                for(int i = R; i >= 1; i--)
                    pos[i] = pos[i-1] & map[i];
            break;
            
            case 'W':
                for(int i = 1; i <= R; i++)
                    pos[i] = (pos[i] << 1) & map[i];
            break;
            
            case '?':
                for(int i = 1; i <= R; i++)
                    _pos[i] = pos[i];
                for(int i = 1; i <= R; i++)
                    pos[i] = (_pos[i+1] & map[i]) 
                            | ((_pos[i] << 1) & map[i]) 
                            | (_pos[i-1] & map[i]) 
                            | ((_pos[i] >> 1) & map[i]);
            break;
        }

        // std::cout << cmds[cmd] << "\n";
        // for(int row = 1; row <= R; row++)
        // {
        //     for(int col = C; col >= 1; col--)
        //     {
        //         if(map[row][col])
        //             std::cout << pos[row][col];
        //         else
        //             std::cout << "#";
        //     }    
        //     std::cout << "\n";
        // }
        // std::cout << "\n";

    }
    
    int sum = 0;
    for(int r = 1; r <= R; r++)
        sum += pos[r].count();

    std::cout << sum;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...