제출 #1188649

#제출 시각아이디문제언어결과실행 시간메모리
1188649andrei_nAwesome Arrowland Adventure (eJOI19_adventure)C++20
50 / 100
5 ms328 KiB
#include <bits/stdc++.h>

using namespace std;

enum {X, N, E, S, W};
const int INF = 9999999;
const int dx[] = {0,-1,0,1,0};
const int dy[] = {0,0,1,0,-1};
int dir[128];
int v[505][505];
int oth[505][505];
int dp[505][2];

inline int dist(int a, int b)
{
    if(a == X) return INF;
    return (a <= b ? b-a : b-a+4);
}

signed main()
{
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int n,m; cin>>n>>m;
    char ch;
    dir['N'] = N;
    dir['E'] = E;
    dir['S'] = S;
    dir['W'] = W;
    dir['X'] = X;
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=m; ++j)
        {
            cin>>ch;
            v[i][j] = dir[ch];
        }
    if(n <= 2)
    {
        dp[1][0] = 0;
        dp[1][1] = INF;
        for(int i=1; i<m; ++i)
        {
            dp[i+1][0] = min(dp[i][0], dp[i][1] + dist(v[2][i], N)) + dist(v[1][i], E);
            dp[i+1][1] = min(dp[i][1], dp[i][0] + dist(v[1][i], S)) + dist(v[2][i], E);
        }
        if(n == 1)
        {
            cout<<(dp[m][0] >= INF ? -1 : dp[m][0]);
        }
        else
        {
            int res = min(dp[m][1], dp[m][0] + dist(v[1][m], S));
            cout<<(res >= INF ? -1 : res);
        }
    }
    else
    {
        vector<pair<int,int>> vect = {{1,1},{1,2},{1,3},{2,1},{2,2},{2,3},{3,1},{3,2},{3,3}};
        int best = INF;
        for(int i=0; i<262144; ++i)
        {
            int cost = 0, ci = i;
            for(auto &j : vect)
            {
                int x = j.first, y = j.second;
                if(v[x][y] == 0)
                    oth[x][y] = 0;
                else
                {
                    cost += dist(v[x][y], (ci & 3) + 1);
                    oth[x][y] = (ci & 3) + 1;
                }
                ci >>= 2;
            }
            int px = 1, py = 1;
            while(px != 3 || py != 3)
            {
                if(oth[px][py] == 0)
                {
                    cost = INF;
                    break;
                }
                int val = oth[px][py];
                oth[px][py] = 0;
                px += dx[val];
                py += dy[val];
            }
            best = min(best, cost);
        }
        cout<<(best == INF ? -1 : best);
    }
    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...