제출 #1329538

#제출 시각아이디문제언어결과실행 시간메모리
1329538Muhammad_AneeqKraljica (COCI25_kraljica)C++20
110 / 110
1161 ms434164 KiB
#include <bits/stdc++.h>
using namespace std;
int const N=1e3+10;
int dp[N][N][9]={};
pair<int,int>dr[9]={};
bool vis[N][N][9]={};

inline void solve()
{
    int n,m;
    cin>>n>>m;
    char a[n][m];
    int si,sj,ei,ej;
    vector<pair<int,int>>ind[10]={};
    for (int i=0;i<n;i++)
    {
        for (int j=0;j<m;j++)
        {
            cin>>a[i][j];
            if (a[i][j]=='S')
                si=i,sj=j;
            if (a[i][j]=='E')
                ei=i,ej=j;
            if (a[i][j]>='0'&&a[i][j]<='9')
            {
                ind[a[i][j]-'0'].push_back({i,j});
            }
            for (int k=0;k<9;k++)
                dp[i][j][k]=1e9+10;
        }
    }
    int ins=1;
    for (int i=-1;i<=1;i++)
    {
        for (int j=-1;j<=1;j++)
        {
            if (i==0&&j==0) continue;
            dr[ins]={i,j};
            ins++;
        }
    }
    dp[si][sj][0]=0;
    deque<vector<int>>Q;
    Q.push_back({si,sj,0});
    while (Q.size())
    {
        vector<int>f=Q.front();
        Q.pop_front();
        int i=f[0],j=f[1],k=f[2];
        if (vis[i][j][k]) continue;
        vis[i][j][k]=1;
        for (int l=1;l<=8;l++)
        {
            int i1=i+dr[l].first,j1=j+dr[l].second;
            if (i1<n&&j1<m&&min(i1,j1)>=0&&a[i][j]!='#')
            {
                if (l==k)
                {
                    if (dp[i1][j1][l]>dp[i][j][k]+(l!=k))
                    {
                        dp[i1][j1][l]=dp[i][j][k];
                        Q.push_front({i1,j1,l});
                    }
                }
                else
                {
                    if (dp[i1][j1][l]>dp[i][j][k]+(l!=k))
                    {
                        dp[i1][j1][l]=dp[i][j][k]+1;
                        Q.push_back({i1,j1,l});
                    }
                }
            }
        }
        if (a[i][j]>='1'&&a[i][j]<='9')
        {
            for (auto [k1,l]:ind[a[i][j]-'0'])
            {
                if (dp[k1][l][0]>dp[i][j][k])
                {
                    Q.push_front({k1,l,0});
                    dp[k1][l][0]=dp[i][j][k];
                }
            }
        }
    }
    int ans=1e9+10;
    for (int i=1;i<=8;i++)
    {
        ans=min(ans,dp[ei][ej][i]);
    }
    if (ans==1e9+10)
        ans=-1;
    cout<<ans<<endl;
}
int main()
{
    ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
    int t=1;
    for (int i=1;i<=t;i++)
    {
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...