제출 #630142

#제출 시각아이디문제언어결과실행 시간메모리
630142alexdumitruAwesome Arrowland Adventure (eJOI19_adventure)C++14
100 / 100
67 ms6108 KiB
#include <bits/stdc++.h>

using namespace std;

struct nod{
    int x,y,c;
};

int n,m,i,j,d[505][505];
char a[505][505];
int b[505][505];

bool in(int x, int y)
{
    return (x>0&&y>0&&x<=n&&y<=m);
}

int cod(char c)
{
    if(c=='N')return 0;
    if(c=='E')return 1;
    if(c=='S')return 2;
    if(c=='W')return 3;
    return 4;
}

int cost(int a, int b)
{
    return (b-a+4)%4;
}

int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};

struct cmp{
    bool operator()(nod a,nod b)
    {
        return a.c>b.c;
    }
};

priority_queue<nod,vector<nod>,cmp>pq;
bool vis[505][505];

void solve()
{
    cin>>n>>m;
    for(i=1;i<=n;i++)
    {
        cin>>(a[i]+1);
        for(j=1;j<=m;j++)
        {
            d[i][j]=1e9;
            b[i][j]=cod(a[i][j]);
        }
    }
    d[1][1]=0;
    pq.push({1,1,0});
    while(!pq.empty())
    {
        int x=pq.top().x;
        int y=pq.top().y;
        int c=pq.top().c;
        pq.pop();
        if(a[x][y]=='X'||vis[x][y])
            continue;
        vis[x][y]=1;
        for(int i=0;i<4;i++)
        {
            int nx=x+dx[i];
            int ny=y+dy[i];
            int nc=c+cost(b[x][y],i);
            if(nc<d[nx][ny])
            {
                d[nx][ny]=nc;
                pq.push({nx,ny,nc});
            }
        }
    }
    cout<<(d[n][m]<1e9?d[n][m]:-1)<<'\n';
}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    solve();
    return 0;
}
#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...