Submission #1256190

#TimeUsernameProblemLanguageResultExecution timeMemory
1256190attkyTracks in the Snow (BOI13_tracks)C++20
100 / 100
431 ms125936 KiB
#include <bits/stdc++.h>

using namespace std;

struct point {
    int x, y;
};

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n, m;
    cin >> n >> m;
    char trace[n][m];
    int distance[n][m];

    for(int loop = 0; loop < n; ++loop) {
        for(int looping = 0; looping < m; ++looping) {
            cin >> trace[loop][looping];
            distance[loop][looping] = 1e9;
        }
    }

    char current;
    int num = 0;

    vector<point> stack;
    queue<point> q;

    distance[0][0] = 1;
    q.push({0, 0});

    while(q.size() > 0) {
        while(q.size() > 0) {
            stack.push_back(q.front());
            q.pop();
        }
        num++;
        current = trace[stack[0].x][stack[0].y];
        while(stack.size() > 0) {
            point enCours = stack.back();
            stack.pop_back();

            if(enCours.x > 0) {
                if(distance[enCours.x-1][enCours.y] == 1e9) {
                    if(trace[enCours.x-1][enCours.y] == current) {
                        stack.push_back({enCours.x-1, enCours.y});
                        distance[enCours.x-1][enCours.y] = num;
                    }
                    else if(trace[enCours.x-1][enCours.y] != '.') {
                        q.push({enCours.x-1, enCours.y});
                        distance[enCours.x-1][enCours.y] = num+1;
                    }
                }
            } 
            if(enCours.x < n-1) {
                if(distance[enCours.x+1][enCours.y] == 1e9) {
                    if(trace[enCours.x+1][enCours.y] == current) {
                        stack.push_back({enCours.x+1, enCours.y});
                        distance[enCours.x+1][enCours.y] = num;
                    }
                    else if(trace[enCours.x+1][enCours.y] != '.') {
                        q.push({enCours.x+1, enCours.y});
                        distance[enCours.x+1][enCours.y] = num+1;
                    }
                }
            } 
            if(enCours.y > 0) {
                if(distance[enCours.x][enCours.y-1] == 1e9) {
                    if(trace[enCours.x][enCours.y-1] == current) {
                        stack.push_back({enCours.x, enCours.y-1});
                        distance[enCours.x][enCours.y-1] = num;
                    }
                    else if(trace[enCours.x][enCours.y-1] != '.') {
                        q.push({enCours.x, enCours.y-1});
                        distance[enCours.x][enCours.y-1] = num+1;
                    }
                }
            } 
            if(enCours.y < m-1) {
                if(distance[enCours.x][enCours.y+1] == 1e9) {
                    if(trace[enCours.x][enCours.y+1] == current) {
                        stack.push_back({enCours.x, enCours.y+1});
                        distance[enCours.x][enCours.y+1] = num;
                    }
                    else if(trace[enCours.x][enCours.y+1] != '.') {
                        q.push({enCours.x, enCours.y+1});
                        distance[enCours.x][enCours.y+1] = num+1;
                    }
                }
            } 
        }
    }

    cout << num << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...