Submission #1138541

#TimeUsernameProblemLanguageResultExecution timeMemory
1138541chrlsTracks in the Snow (BOI13_tracks)C++17
19.38 / 100
944 ms1114112 KiB
#include <bits/stdc++.h>

using namespace std;

constexpr int INF = 1000000;
constexpr int MAXN = 4000;
int grid[MAXN][MAXN];
vector<vector<int>> component (MAXN, vector<int>(MAXN, -1));
set<int> adj[MAXN];
int num_components = 0;
int R, C;

void dfs(int r, int c, int num){
    component[r][c] = num;
    if(r>0){
        if(grid[r-1][c] == grid[r][c] && component[r-1][c] == -1){
            dfs(r-1, c, num);
        }
        if(grid[r-1][c] != grid[r][c] && component[r-1][c] != -1){
            adj[num].insert(component[r-1][c]);
            adj[component[r-1][c]].insert(num);
        }

    }
    if(r<R-1){
        if(grid[r+1][c] == grid[r][c] && component[r+1][c] == -1){
            dfs(r+1, c, num);
        }
        if(grid[r+1][c] != grid[r][c] && component[r+1][c] != -1){
            adj[num].insert(component[r+1][c]);
            adj[component[r+1][c]].insert(num);
        }
    }
    if(c>0){
        if(grid[r][c-1] == grid[r][c] && component[r][c-1] == -1){
            dfs(r, c-1, num);
        }
        if(grid[r][c-1] != grid[r][c] && component[r][c-1] != -1){
            adj[num].insert(component[r][c-1]);
            adj[component[r][c-1]].insert(num);
        }
    }
    if(c<C-1){
        if(grid[r][c+1] == grid[r][c] && component[r][c+1] == -1){
            dfs(r, c+1, num);
        }
        if(grid[r][c+1] != grid[r][c] && component[r][c+1] != -1){
            adj[num].insert(component[r][c+1]);
            adj[component[r][c+1]].insert(num);
        }
    }
}

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

    cin >> R >> C;
    char a;
    for(int r = 0; r != R; ++r){
        for(int c = 0; c != C; ++c){
            cin >> a;
            if(a == '.') { grid[r][c] = 0; }
            if(a == 'R') { grid[r][c] = 1; }
            if(a == 'F') { grid[r][c] = 2; }
        }
    }

    for(int r = 0; r != R; ++r){
        for(int c = 0; c != C; ++c){
            if(component[r][c] != -1) continue;
            if(grid[r][c] == 0) continue;
            dfs(r, c, num_components);
            num_components++;
        }
    }

    //bfs
    vector<int> visited(num_components, INF);
    queue<int> q;
    q.push(0);
    visited[0] = 1;
    while(!q.empty()){
        int x = q.front();
        q.pop();
        //process node
        for(int e : adj[x]){
            if(visited[e] != INF) continue;
            q.push(e);
            visited[e] = visited[x] + 1;
        }
    }

    int result = 0;
    for(int i = 0; i < num_components; ++i){
        result = max(result, visited[i]);
    }

    cout << result;

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...