제출 #1364552

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

const int maxN = 4000;
const int inf = 1e9+83;
char meadow[maxN][maxN];
int bicho[maxN][maxN];
vector<int> graph[maxN*maxN+1];
int dis[maxN*maxN+1];

int w, h;

void bfs(int x, int y){
    queue<pair<int,int>> tv;
    tv.push({x,y});
    int n = bicho[x][y];
    char esto = meadow[x][y];
    char otro = 'R'+'F'-esto;
    vector<bool> con(n+1, 0);
    con[n] = true;

    while(!tv.empty()){
        x = tv.front().first;
        y = tv.front().second;
        tv.pop();
        // Exploring other parts of the component
        if(x > 0 && meadow[x-1][y] == esto && bicho[x-1][y] == -1){
            bicho[x-1][y] = bicho[x][y];
            tv.push({x-1,y});
        }
        if(x < w-1 && meadow[x+1][y] == esto && bicho[x+1][y] == -1){
            bicho[x+1][y] = bicho[x][y];
            tv.push({x+1,y});
        }
        if(y > 0 && meadow[x][y-1] == esto && bicho[x][y-1] == -1){
            bicho[x][y-1] = bicho[x][y];
            tv.push({x,y-1});
        }
        if(y < h-1 && meadow[x][y+1] == esto && bicho[x][y+1] == -1){
            bicho[x][y+1] = bicho[x][y];
            tv.push({x,y+1});
        }  
        
        // Joining the components
        if(x > 0 && meadow[x-1][y] == otro && bicho[x-1][y] != -1){
            if(!con[bicho[x-1][y]]) {
                con[bicho[x-1][y]] = true;
                graph[n].push_back(bicho[x-1][y]);
                graph[bicho[x-1][y]].push_back(n);
            }
        }
        if(x < w-1 && meadow[x+1][y] == otro && bicho[x+1][y] != -1){
            if(!con[bicho[x+1][y]]) {
                con[bicho[x+1][y]] = true;
                graph[n].push_back(bicho[x+1][y]);
                graph[bicho[x+1][y]].push_back(n);
            }
        }
        if(y > 0 && meadow[x][y-1] == otro && bicho[x][y-1] != -1){
            if(!con[bicho[x][y-1]]) {
                con[bicho[x][y-1]] = true;
                graph[n].push_back(bicho[x][y-1]);
                graph[bicho[x][y-1]].push_back(n);
            }
        }
        if(y < h-1 && meadow[x][y+1] == otro && bicho[x][y+1] != -1){
            if(!con[bicho[x][y+1]]) {
                con[bicho[x][y+1]] = true;
                graph[n].push_back(bicho[x][y+1]);
                graph[bicho[x][y+1]].push_back(n);
            }
        }  
    }
}

int bfs2(int node) {
    queue<int> tv;
    tv.push(node);
    dis[node] = 1;
    int mx = 1;
    while(!tv.empty()){
        node = tv.front();
        tv.pop();
        for(int u : graph[node]){
            if(dis[u] == -1){
                tv.push(u);
                dis[u] = dis[node]+1;
                mx = max(dis[u], mx);
            }
        }
    }
    return mx;
}

int main(){
    cin >> w >> h;
    int cnt = 0;
    memset(meadow, 0, sizeof(meadow));
    memset(bicho, -1, sizeof(bicho));
    memset(dis, -1, sizeof(dis));
    for(int i = 0; i < w; ++i){
        for(int j = 0; j < h; ++j){
            cin >> meadow[i][j];
        }
    }
    for(int i = 0; i < w; ++i){
        for(int j = 0; j < h; ++j){
            if(bicho[i][j] == -1 && meadow[i][j] != '.'){
                bicho[i][j] = cnt++;
                bfs(i, j);
            }
        }
    }
    /*
    cout << '\n';
    for(int i = 0; i < w; ++i){
        for(int j = 0; j < h; ++j){
            if(bicho[i][j] == -1) cout << '.';
            else cout << bicho[i][j];
        }cout << '\n';
    } cout << '\n';

    for(int i = 0; i < cnt; ++i){
        cout << i << ": ";
        for(int u : graph[i]) cout << u << ' ';
        cout << '\n';
    }  
    */
   
    int mx = bfs2(0);
    cout << mx << '\n';

    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…