제출 #1081881

#제출 시각아이디문제언어결과실행 시간메모리
1081881MrPavlitoTracks in the Snow (BOI13_tracks)C++17
100 / 100
485 ms162820 KiB
#include <bits/stdc++.h>
//#define int long long
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define sc second
#define endl "\n"
#define pii pair<int,int>

using namespace std;

const int MAXN = 4005;
const int mod7 = 1e9+7;
const long long inf = 1e9;
struct str
{
    int a,b,c;
};

vector<vector<int>> dist(MAXN, vector<int>(MAXN,inf));
deque<str> pq;


signed main()
{
    ios_base::sync_with_stdio(false),cin.tie(0), cout.tie(0);
    int tt=1;
    //cin >> tt;
    while(tt--)
    {
        int n,m;
        cin >> n >> m;
        vector<string>mat(n);
        for(int i=0; i<n; i++)cin >> mat[i];
        dist[0][0] = 0;
        pq.pb({0,0,0});
        while(!pq.empty())
        {
            auto it = pq.front();
            pq.pop_front();
            int i = it.b;
            int j = it.c;
            int d = it.a;
            if(i>0 && mat[i-1][j]!='.')
            {
                int cost = (mat[i][j] != mat[i-1][j]);
                if(dist[i-1][j] > dist[i][j] + cost)
                {
                    dist[i-1][j] = dist[i][j] + cost;
                    if(cost)pq.push_back({dist[i-1][j], i-1, j});
                    else pq.push_front({dist[i-1][j], i-1, j});
                }
            }

            if(i<n-1&& mat[i+1][j]!='.')
            {
                int cost = (mat[i][j] != mat[i+1][j]);
                if(dist[i+1][j] > dist[i][j] + cost)
                {

                    dist[i+1][j] = dist[i][j] + cost;
                    if(cost)pq.push_back({dist[i+1][j], i+1, j});
                    else pq.push_front({dist[i+1][j], i+1, j});
                }
            }

            if(j>0&& mat[i][j-1]!='.')
            {
                int cost = (mat[i][j] != mat[i][j-1]);
                if(dist[i][j-1] > dist[i][j] + cost)
                {

                    dist[i][j-1] = dist[i][j] + cost;
                    if(cost)pq.push_back({dist[i][j-1], i, j-1});
                    else pq.push_front({dist[i][j-1], i, j-1});
                }
            }
            if(j<m-1 && mat[i][j+1]!='.')
            {
                int cost = (mat[i][j] != mat[i][j+1]);
                if(dist[i][j+1] > dist[i][j] + cost)
                {
                    dist[i][j+1] = dist[i][j] + cost;
                    if(cost)pq.push_back({dist[i][j+1], i, j+1});
                    else pq.push_front({dist[i][j+1], i, j+1});

                }
            }

        }
        int mx = 0;
        for(int i = 0;i<n; i++)
        {
            for(int j=0; j<m; j++)if(dist[i][j]!=inf)mx = max(mx, dist[i][j]);
        }
        cout << mx+1 << endl;

    }
}

/*
3 4
FFRR
RFRF
RFRF
*/

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

tracks.cpp: In function 'int main()':
tracks.cpp:44:17: warning: unused variable 'd' [-Wunused-variable]
   44 |             int d = it.a;
      |                 ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...