제출 #885688

#제출 시각아이디문제언어결과실행 시간메모리
885688KarootTracks in the Snow (BOI13_tracks)C++17
100 / 100
1107 ms413780 KiB
#include <iostream>
#include <cmath>
#include <unordered_map>
#include <map>
#include <set>
#include <queue>
#include <vector>
#include <string>
#include <iomanip>
#include <algorithm>
#include <deque>

#define all(x)  (x).begin(), (x).end()
#define rall(x)  (x).rbegin(), (x).rend()

using namespace std;

typedef long long ll;

ll linf = 1e15+1;

inline void scoobydoobydoo(){
    ios::sync_with_stdio(false);
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
}

vector<pair<int, int> > neighbours;

const int MAXN = 4e3+1;
char arr[MAXN][MAXN];
int isVisited[MAXN][MAXN];

int main(){
    scoobydoobydoo();
    int r, C; cin >> r >> C;
    for (int i = 0; i < r; i++){
        for (int j = 0; j < C; j++){
            cin >> arr[i][j];
        }
    }

    deque<vector<int> > dq; //x, y, w
    dq.push_back({0, 0, 1});
    int lastW;


    while (!dq.empty()){
        int x = dq.front()[0];
        int y = dq.front()[1];
        int w = dq.front()[2];
        dq.pop_front();
        if (isVisited[x][y] != 0 && isVisited[x][y] < w)continue;
    
        lastW = w;      
        char c = arr[x][y];
        if (x > 0 && arr[x-1][y] != '.'){
            if (arr[x-1][y] == c && (isVisited[x-1][y] > w || isVisited[x-1][y] == 0)){
                isVisited[x-1][y] = w;
                dq.push_front({x-1, y, w});
            } else if ((isVisited[x-1][y] > w+1 || isVisited[x-1][y] == 0)){
                isVisited[x-1][y] = w+1;
                dq.push_back({x-1, y, w+1});
            }
        }
        if (x < r-1 && arr[x+1][y] != '.'){
            if (arr[x+1][y] == c && (isVisited[x+1][y] > w || isVisited[x+1][y] == 0)){
                isVisited[x+1][y] = w;
                dq.push_front({x+1, y, w});
            } else if ((isVisited[x+1][y] > w+1 || isVisited[x+1][y] == 0)){
                isVisited[x+1][y] = w+1;
                dq.push_back({x+1, y, w+1});
            }
        }
        if (y > 0 && arr[x][y-1] != '.'){
            if (arr[x][y-1] == c && (isVisited[x][y-1] > w || isVisited[x][y-1] == 0)){
                isVisited[x][y-1] = w;
                dq.push_front({x, y-1, w});
            } else if ((isVisited[x][y-1] > w+1 || isVisited[x][y-1] == 0)){
                isVisited[x][y-1] = w+1;
                dq.push_back({x, y-1, w+1});
            }
        }
        if (y < C-1  && arr[x][y+1] != '.'){
            if (arr[x][y+1] == c && (isVisited[x][y+1] > w || isVisited[x][y+1] == 0)){
                isVisited[x][y+1] = w;
                dq.push_front({x, y+1, w});
            } else if ((isVisited[x][y+1] > w+1 || isVisited[x][y+1] == 0)){
                isVisited[x][y+1] = w+1;
                dq.push_back({x, y+1, w+1});
            }
        }
    }

    cout << lastW << endl;

    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

tracks.cpp: In function 'int main()':
tracks.cpp:95:13: warning: 'lastW' may be used uninitialized in this function [-Wmaybe-uninitialized]
   95 |     cout << lastW << endl;
      |             ^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...