제출 #1332833

#제출 시각아이디문제언어결과실행 시간메모리
1332833danielwu11Tracks in the Snow (BOI13_tracks)C++20
100 / 100
769 ms136176 KiB
#include <bits/stdc++.h>
using namespace std;

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int N, M;
    cin >> N >> M;
    vector<vector<int>> grid(N, vector<int>(M));
    for(int i=0; i<N; i++){
        string s;
        cin >> s;
        for(int j=0; j<M; j++){
            if(s[j]=='.'){
                grid[i][j]=0;
            }
            if(s[j]=='R'){
                grid[i][j]=1;
            }
            if(s[j]=='F'){
                grid[i][j]=2;
            }
            // cout << grid[i][j] << " ";
        }
        // cout << endl;
    }
    // rabbit is 1, fox is 2
    int xadj[]={1, 0, -1, 0};
    int yadj[]={0, 1, 0, -1};
    vector<vector<int>> visited(N, vector<int>(M, -1));
    queue<pair<int, int>> q1;
    queue<pair<int, int>> q2;
    q1.push({0, 0});
    visited[0][0]=1;
    int maxdist=1;
    while (!q1.empty()) {
        while(!q1.empty()){
            int x=q1.front().first;
            int y=q1.front().second;
            q1.pop();
            for(int k=0; k<4; k++){
                int newx=x+xadj[k];
                int newy=y+yadj[k];
                if((newx<0 || newx>=N || newy<0 || newy>=M)||visited[newx][newy]!=-1||grid[newx][newy]==0){
                    continue;
                }
                if (grid[x][y]==grid[newx][newy]) {
                    visited[newx][newy]=visited[x][y];
                    q1.push({newx, newy});
                }
                else {
                    visited[newx][newy]=visited[x][y]+1;
                    q2.push({newx, newy});
                }
                maxdist=max(maxdist,visited[newx][newy]);
            }
        }
        while(!q2.empty()){
            int x=q2.front().first;
            int y=q2.front().second;
            q2.pop();
            for(int k=0; k<4; k++){
                int newx=x+xadj[k];
                int newy=y+yadj[k];
                if((newx<0 || newx>=N || newy<0 || newy>=M)||visited[newx][newy]!=-1||grid[newx][newy]==0){
                    continue;
                }
                if (grid[x][y]==grid[newx][newy]) {
                    visited[newx][newy]=visited[x][y];
                    q2.push({newx, newy});
                }
                else {
                    visited[newx][newy]=visited[x][y]+1;
                    q1.push({newx, newy});
                }
                maxdist=max(maxdist,visited[newx][newy]);
            }
        }
    }
    cout << maxdist << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...