제출 #1146078

#제출 시각아이디문제언어결과실행 시간메모리
1146078moaipoTracks in the Snow (BOI13_tracks)C++20
91.25 / 100
2118 ms1114112 KiB
#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<vector<int>> v;
vector<pair<int,int>> mv = {{0,1},{0,-1},{1,0},{-1,0}};

int main(){
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    cin>>n>>m;
    v = vector<vector<int>> (n, vector<int>(m));
    auto odw = vector<vector<bool>> (n, vector<bool>(m));

    char c;
    for(int i=0;i<n;i++){
        for (int j = 0; j < m; ++j) {
            cin>>c;
            if(c=='R') v[i][j] = 1;
            else if(c=='F') v[i][j] = -1;
        }
    }

    vector<vector<int>> nq;
    vector<vector<int>> q = {{0,0}}; // x, y
    int maxi = 0;
    bool a = true;
    int iq=0, inq=0;
    while(true) {
        int ssiz = a ? q.size() : nq.size();
        int cq = a ? iq : inq;
        if(cq >= ssiz) break;
        for(;cq<ssiz;cq++) {
            auto cur = a ? q[cq] : nq[cq];
            int x = cur[0], y = cur[1], r = v[y][x];
            if(r==0) continue;
            for(auto &cm : mv) {
                int nx = x + cm.first, ny = y + cm.second;
                if(nx<0 || ny<0 || nx>=m || ny>=n) continue;
                if(odw[ny][nx]) continue;
                int nr = v[ny][nx];
                if(nr == -1 * r) {
                    if(a) nq.push_back({nx, ny});
                    else q.push_back({nx, ny});
                } else if(nr == r) {
                    if(a) q.push_back({nx, ny});
                    else nq.push_back({nx, ny});
                    ssiz++;
                }
                odw[ny][nx] = true;
            }
        }
        if(a) iq = cq;
        else inq = cq;
        a = !a;
        maxi++;
    }

    cout<<maxi<<'\n';
}

/*
 5 8
FFR.....
.FRRR...
.FFFFF..
..RRRFFR
.....FFF

 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...