Submission #631916

#TimeUsernameProblemLanguageResultExecution timeMemory
631916KALARRYAwesome Arrowland Adventure (eJOI19_adventure)C++14
100 / 100
107 ms32176 KiB
#include<bits/stdc++.h>

using namespace std;

const long long INF = 1e14;

long long N,M,dist[250005];
vector<pair<long long,long long>> adj[250005];
bool visited[250005];

long long id(long long y,long long x)
{
    return (y-1)*N+x;
}
bool in_bounds(long long y,long long x)
{
    return 1<=x&&x<=N&&1<=y&&y<=M;
}

void dijkstra(long long start)
{
    priority_queue<pair<long long,long long>> q;
    for(long long i =1 ; i <= N*M ; i++)
        dist[i]=INF;
    dist[start]=0;
    q.push({0,start});
    while(!q.empty())
    {
        long long v= q.top().second;
        q.pop();
        if(visited[v])
            continue;
        visited[v]=true;
        for(auto e : adj[v])
        {
            long long w = e.first;
            long long u = e.second;
            if(dist[v]+w<dist[u])
            {
                dist[u]=dist[v]+w;
                q.push({-dist[u],u});        
            }
        }
    }
}
int main()
{
    scanf("%lld%lld",&M,&N);    
    for(long long i =1 ; i <= M ; i++)
    {
        for(long long j = 1 ; j <= N ; j++)
        {
            char arrow;
            scanf(" %c",&arrow);
            if(arrow=='E')
            {
                if(in_bounds(i,j+1))
                    adj[id(i,j)].push_back({0,id(i,j+1)});
                if(in_bounds(i+1,j))
                    adj[id(i,j)].push_back({1,id(i+1,j)});
                if(in_bounds(i,j-1))
                    adj[id(i,j)].push_back({2,id(i,j-1)});
                if(in_bounds(i-1,j))
                    adj[id(i,j)].push_back({3,id(i-1,j)});
            }
            if(arrow=='S')
            {
                if(in_bounds(i+1,j))
                    adj[id(i,j)].push_back({0,id(i+1,j)});
                if(in_bounds(i,j-1))
                    adj[id(i,j)].push_back({1,id(i,j-1)});
                if(in_bounds(i-1,j))
                    adj[id(i,j)].push_back({2,id(i-1,j)});
                if(in_bounds(i,j+1))
                    adj[id(i,j)].push_back({3,id(i,j+1)});
            }
            if(arrow=='W')
            {
                if(in_bounds(i,j-1))
                    adj[id(i,j)].push_back({0,id(i,j-1)});
                if(in_bounds(i-1,j))
                    adj[id(i,j)].push_back({1,id(i-1,j)});
                if(in_bounds(i,j+1))
                    adj[id(i,j)].push_back({2,id(i,j+1)});
                if(in_bounds(i+1,j))
                    adj[id(i,j)].push_back({3,id(i+1,j)});
            }
            if(arrow=='N')
            {
                if(in_bounds(i-1,j))
                    adj[id(i,j)].push_back({0,id(i-1,j)});
                if(in_bounds(i,j+1))
                    adj[id(i,j)].push_back({1,id(i,j+1)});
                if(in_bounds(i+1,j))
                    adj[id(i,j)].push_back({2,id(i+1,j)});
                if(in_bounds(i,j-1))
                    adj[id(i,j)].push_back({3,id(i,j-1)});
            }
            if(arrow=='X')
                visited[id(i,j)]=true;
        }
    }
    dijkstra(1);
    if(dist[id(M,N)]==INF)
        printf("-1\n");
    else
        printf("%lld\n",dist[id(M,N)]);
    return 0;
}

Compilation message (stderr)

adventure.cpp: In function 'int main()':
adventure.cpp:48:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   48 |     scanf("%lld%lld",&M,&N);
      |     ~~~~~^~~~~~~~~~~~~~~~~~
adventure.cpp:54:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   54 |             scanf(" %c",&arrow);
      |             ~~~~~^~~~~~~~~~~~~~
#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...