Submission #1154704

#TimeUsernameProblemLanguageResultExecution timeMemory
1154704dostsRobots (APIO13_robots)C++17
60 / 100
1523 ms109384 KiB
#include <bits/stdc++.h>
using namespace std;
//#define int long long
#define pii pair<int,int>
#define ff first
#define ss second
#define sp << " " <<    
#define all(cont) cont.begin(),cont.end()
#define vi vector<int>
 
const int inf = 1e9,N = 2e6+1,MOD = 998244353,B = 600;

vector<string> grid;

int dp[500][500][10][10];
pii go[500][500][4];

vi dx{0,1,0,-1},dy{1,0,-1,0};

int h,w;
pii dfs(int x,int y,int d){
    if (go[x][y][d].ff != -2) return go[x][y][d];
    if (grid[x][y] == 'x') return go[x][y][d] = {-1,-1};
    int dd = d;
    if (grid[x][y] == 'C') dd = (dd+1)%4;
    if (grid[x][y] == 'A') dd = (dd+3)%4;
    int gx = x+dx[dd],gy = y+dy[dd];
    if (gx < 0 || gx >= h || gy < 0 || gy >= w || grid[gx][gy] == 'x') return go[x][y][d] = {x,y};
    go[x][y][d] = {-1,-1};
    return go[x][y][d] = dfs(gx,gy,dd);
}

void solve() {  
    int n;
    cin >> n >> w >> h;
    grid.resize(h);
    for (auto& it : grid) cin >> it;
    for (int i = 0;i<h;i++) for (int j = 0;j<w;j++) for (int ii = 0;ii<10;ii++) for (int jj = 0;jj<10;jj++) {
        dp[i][j][ii][jj] = inf;
    }
    for (int i = 0;i<h;i++) for (int j = 0;j<w;j++) for (int ii = 0;ii<4;ii++) go[i][j][ii] = {-2,-2};
    for (int i = 0;i<h;i++) {
        for (int j = 0;j<w;j++) {
            for (int ii = 0;ii<4;ii++) {
                dfs(i,j,ii);
            }
        }
    }
    using state = pair<int,pii>;
    for (int L = n;L>=1;L--) {
        for (int R = L;R<=n;R++) {
            priority_queue<state,vector<state>,greater<state>> pq;
            for (int i=0;i<h;i++) {
                for (int j=0;j<w;j++) {
                    if (L == R && (grid[i][j]-'0' == L && grid[i][j] >= '1' && grid[i][j] <= '0'+n)) {
                        dp[i][j][L][R] = 0;
                    }
                    for (int M = L;M<R;M++) {
                        if (dp[i][j][L][M] == inf) continue;
                        dp[i][j][L][R] = min(dp[i][j][L][R],dp[i][j][L][M]+dp[i][j][M+1][R]);
                    }
                    if (dp[i][j][L][R] != inf) {
                        //cout << i sp j sp L sp R sp dp[i][j][L][R] << '\n';
                        pq.push({dp[i][j][L][R],{i,j}});
                    }
                }
            }
            while (!pq.empty()) {
                state s = pq.top();
                pq.pop();
                if (dp[s.ss.ff][s.ss.ss][L][R] != s.ff) continue;
                for (int i = 0;i<4;i++) {
                    int gx = go[s.ss.ff][s.ss.ss][i].ff;
                    int gy = go[s.ss.ff][s.ss.ss][i].ss;
                    if (gx < 0 || gy < 0) continue;
                    if (dp[gx][gy][L][R] <= dp[s.ss.ff][s.ss.ss][L][R]+1) continue;
                    dp[gx][gy][L][R] = dp[s.ss.ff][s.ss.ss][L][R]+1;
                    pq.push({dp[gx][gy][L][R],{gx,gy}});
                }
            }   
        }
    }
    int ans = inf;
    for (int i=0;i<h;i++) {
        for (int j = 0;j<w;j++) {
            ans = min(ans,dp[i][j][1][n]);
        }
    }
    if (ans >= inf) cout << -1 << '\n';
    else cout << ans << '\n';
}

int32_t main() { 
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    #ifdef Dodi 
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
    #endif
    int t = 1;
    //cin >> t;
    while (t --> 0) 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...