Submission #101457

#TimeUsernameProblemLanguageResultExecution timeMemory
101457rocketninja7Tracks in the Snow (BOI13_tracks)C++14
100 / 100
1643 ms88968 KiB
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

pair<int, int> dir[]={make_pair(0, -1), make_pair(1, 0), make_pair(0, 1), make_pair(-1, 0)};

int main(){
    int H, W;
    scanf("%d%d", &H, &W);
    char grid[H][W+1];
    for(int i=0;i<H;i++){
        scanf("%s", &grid[i]);
    }
    int dist[H][W];
    for(int i=0;i<H;i++){
        for(int j=0;j<W;j++){
            dist[i][j]=-1;
        }
    }
    dist[0][0]=1;
    queue<pair<int, int> > procA;
    queue<pair<int, int> > procB;
    procA.push(make_pair(0, 0));
    while(!procA.empty()||!procB.empty()){
        while(!procA.empty()){
            int x=procA.front().first, y=procA.front().second;
            procA.pop();
            for(int i=0;i<4;i++){
                if(x+dir[i].first>-1&&x+dir[i].first<H&&y+dir[i].second>-1&&y+dir[i].second<W){
                    if(grid[x+dir[i].first][y+dir[i].second]!='.'){
                        if(dist[x+dir[i].first][y+dir[i].second]==-1){
                            if(grid[x+dir[i].first][y+dir[i].second]==grid[x][y]){
                                dist[x+dir[i].first][y+dir[i].second]=dist[x][y];
                                procA.push(make_pair(x+dir[i].first, y+dir[i].second));
                            }
                            else{
                                dist[x+dir[i].first][y+dir[i].second]=dist[x][y]+1;
                                procB.push(make_pair(x+dir[i].first, y+dir[i].second));
                            }
                        }
                    }
                }
            }
        }
        while(!procB.empty()){
            int x=procB.front().first, y=procB.front().second;
            procB.pop();
            for(int i=0;i<4;i++){
                if(x+dir[i].first>-1&&x+dir[i].first<H&&y+dir[i].second>-1&&y+dir[i].second<W){
                    if(grid[x+dir[i].first][y+dir[i].second]!='.'){
                        if(dist[x+dir[i].first][y+dir[i].second]==-1){
                            if(grid[x+dir[i].first][y+dir[i].second]==grid[x][y]){
                                dist[x+dir[i].first][y+dir[i].second]=dist[x][y];
                                procB.push(make_pair(x+dir[i].first, y+dir[i].second));
                            }
                            else{
                                dist[x+dir[i].first][y+dir[i].second]=dist[x][y]+1;
                                procA.push(make_pair(x+dir[i].first, y+dir[i].second));
                            }
                        }
                    }
                }
            }
        }
    }
    int ans=1;
    for(int i=0;i<H;i++){
        for(int j=0;j<W;j++){
            ans=max(ans, dist[i][j]);
        }
    }
    printf("%d", ans);
    return 0;
}

Compilation message (stderr)

tracks.cpp: In function 'int main()':
tracks.cpp:14:29: warning: format '%s' expects argument of type 'char*', but argument 2 has type 'char (*)[(W + 1)]' [-Wformat=]
         scanf("%s", &grid[i]);
                     ~~~~~~~~^
tracks.cpp:11:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d", &H, &W);
     ~~~~~^~~~~~~~~~~~~~~~
tracks.cpp:14:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%s", &grid[i]);
         ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...