Submission #1168771

#TimeUsernameProblemLanguageResultExecution timeMemory
1168771byunjaewooRobots (APIO13_robots)C++20
60 / 100
1580 ms70276 KiB
#include <bits/stdc++.h>
using namespace std;

const int N=10, X=510, INF=1e9;
int n, h, w, ans=INF, x[N], y[N], a[X][X], nxt[X][X], dp[N][N][X][X];
int dx[4]={-1, 0, 1, 0}, dy[4]={0, 1, 0, -1};
vector<pair<int, int>> adj[X][X];
queue<pair<int, pair<int, int>>> que;

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin>>n>>w>>h;
    for(int i=1; i<=h; i++) {
        string s; cin>>s;
        for(int j=1; j<=w; j++) {
            if('1'<=s[j-1] && s[j-1]<='9') x[s[j-1]-'0']=i, y[s[j-1]-'0']=j;
            else if(s[j-1]=='A') a[i][j]=1;
            else if(s[j-1]=='C') a[i][j]=2;
            else if(s[j-1]=='x') a[i][j]=-1;
        }
    }
    for(int i=1; i<=h; i++) for(int j=1; j<=w; j++) {
        for(int d=0; d<4; d++) {
            int ii=i, jj=j, dd=d;
            while(true) {
                if(ii+dx[dd]<1 || ii+dx[dd]>h || jj+dy[dd]<1 || jj+dy[dd]>w || a[ii+dx[dd]][jj+dy[dd]]<0) break;
                ii+=dx[dd], jj+=dy[dd];
                if(a[ii][jj]==1) dd=(dd+3)%4;
                if(a[ii][jj]==2) dd=(dd+1)%4;
            }
            if(i!=ii || j!=jj) adj[i][j].push_back({ii, jj});
        }
    }
    for(int l=1; l<=n; l++) for(int r=l; r<=n; r++) for(int i=1; i<=h; i++) for(int j=1; j<=w; j++) dp[l][r][i][j]=INF;
    for(int i=1; i<=n; i++) dp[i][i][x[i]][y[i]]=0;
    for(int d=1; d<=n; d++) {
        for(int l=1; l<=n-d+1; l++) {
            int r=l+d-1;
            for(int k=l; k<r; k++) for(int i=1; i<=h; i++) for(int j=1; j<=w; j++)
                dp[l][r][i][j]=min(dp[l][r][i][j], dp[l][k][i][j]+dp[k+1][r][i][j]);
            vector<pair<int, pair<int, int>>> vec;
            for(int i=1; i<=h; i++) for(int j=1; j<=w; j++) vec.push_back({dp[l][r][i][j], {i, j}});
            sort(vec.rbegin(), vec.rend());
            while(!vec.empty() || !que.empty()) {
                int d=0, x=0, y=0;
                if(vec.empty() || !que.empty() && que.front().first<vec.back().first)
                    d=que.front().first, x=que.front().second.first, y=que.front().second.second, que.pop();
                else d=vec.back().first, x=vec.back().second.first, y=vec.back().second.second, vec.pop_back();
                for(auto [i, j]:adj[x][y]) if(dp[l][r][i][j]>d+1)
                    dp[l][r][i][j]=d+1, que.push({d+1, {i, j}});
            }
        }
    }
    for(int i=1; i<=h; i++) for(int j=1; j<=w; j++) ans=min(ans, dp[1][n][i][j]);
    if(ans>=INF/10) ans=-1;
    cout<<ans;
    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...