제출 #1332825

#제출 시각아이디문제언어결과실행 시간메모리
1332825danielwu11Tracks in the Snow (BOI13_tracks)C++20
84.69 / 100
2107 ms721760 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
    vector<int> xadj={1, 0, -1, 0};
    vector<int> yadj={0, 1, 0, -1};
    vector<vector<int>> visited(N, vector<int>(M, -1));
    int cnt=0;
    for(int i=0; i<N; i++){
        for(int j=0; j<M; j++){
            if(visited[i][j]==-1 && grid[i][j]!=0){
                queue<pair<int, int>> q;
                q.push({i, j});
                visited[i][j]=cnt;
                int c=grid[i][j];
                while(!q.empty()){
                    int x=q.front().first;
                    int y=q.front().second;
                    q.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]!=c){
                            continue;
                        }
                        visited[newx][newy]=cnt;
                        q.push({newx, newy});
                    }
                }
                cnt++;
            }
        }
    }
    // cout << endl;
    // for(int i=0; i<N; i++){
    //     for(int j=0; j<M; j++){
    //         cout << visited[i][j] << " ";
    //     }
    //     cout << endl;
    // }
    vector<set<int>> adj(cnt, set<int>());
    for(int i=0; i<N; i++){
        for(int j=0; j<M; j++){
            for(int k=0; k<4; k++){
                if (visited[i][j] == -1) continue;
                int newx=i+xadj[k];
                int newy=j+yadj[k];
                if((newx<0 || newx>=N || newy<0 || newy>=M)||visited[newx][newy]==-1){
                    continue;
                }
                adj[visited[i][j]].insert(visited[newx][newy]);
                adj[visited[newx][newy]].insert(visited[i][j]);
            }
        }
    }
    //shortest from 0 to any
    vector<int> visited2(cnt, -1);
    queue<int> bfs;
    bfs.push(0);
    visited2[0]=1;
    while(!bfs.empty()){
        int temp=bfs.front();
        bfs.pop();
        for(int v:adj[temp]){
            if(v==temp) continue;
            if(visited2[v]==-1){
                bfs.push(v);
                visited2[v]=visited2[temp]+1;
            }
        }
    }
    int ans=-1;
    for(int i=0; i<cnt; i++){
        ans=max(ans, visited2[i]);
    }
    cout << ans << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...