제출 #1329484

#제출 시각아이디문제언어결과실행 시간메모리
1329484Faisal_SaqibKraljica (COCI25_kraljica)C++20
110 / 110
2992 ms82704 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <array>
#include <cmath>
#include <queue>
#include <set>
#include <map>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef long double ld;
#define int ll
char g[1001][1001];
int d[1001][1001][10];
// 
vector<pair<int,int>> oc[300];
int32_t main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,m,sx,sy,ex,ey;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>g[i][j];
            for(int k=0;k<9;k++)
                d[i][j][k]=1e9+10;
            if(g[i][j]<='9' and g[i][j]>='1')
            {
                oc[g[i][j]].push_back({i,j});
            }
            else
            {

            }
            if(g[i][j]=='S')
            {
                sx=i,sy=j;
            }
            else if(g[i][j]=='E')
            {
                ex=i,ey=j;
            }
        }
    }
    queue<array<int,3>> cur;
    d[sx][sy][8]=0;
    cur.push({sx,sy,8});
    int dx[]={0,0,1,1,1,-1,-1,-1};
    int dy[]={-1,1,-1,0,1,-1,0,1};
    while(cur.size())
    {
        int x=cur.front()[0];
        int y=cur.front()[1];
        int lst=cur.front()[2];
        int dt=d[x][y][lst];
        cur.pop();
        for(int i=0;i<8;i++)
        {
            int nx=x+dx[i],ny=y+dy[i];
            if(1<=nx and nx<=n and 1<=ny and ny<=m and g[nx][ny]!='#' and d[nx][ny][i]>dt+(lst!=i))
            {
                d[nx][ny][i]=dt+(lst!=i);
                cur.push({nx,ny,i});
            }
        }
        if('1'<=g[x][y] and g[x][y]<='9')
        {
            int i=8;
            for(auto [nx,ny]:oc[g[x][y]])
            {
                if(1<=nx and nx<=n and 1<=ny and ny<=m and g[nx][ny]!='#' and d[nx][ny][i]>dt)
                {
                    d[nx][ny][i]=dt;
                    cur.push({nx,ny,i});
                }   
            }
        }
    }
    int mi=d[ex][ey][0];
    for(int i=1;i<=8;i++)mi=min(mi,d[ex][ey][i]);
    if(mi>1e9)
    {
        cout<<-1<<endl;
    }
    else
    {
        cout<<mi<<endl;
    }
}
#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...