Submission #1292253

#TimeUsernameProblemLanguageResultExecution timeMemory
1292253trandangquangRobots (APIO13_robots)C++20
100 / 100
828 ms92652 KiB
#include<bits/stdc++.h>
using namespace std;

#define foru(i,a,b) for(int i=(a); i<=(b); ++i)
#define ford(i,a,b) for(int i=(a); i>=(b); --i)
#define rep(i,a) for(int i=0; i<(a); ++i)
#define sz(a) (int)(a).size()
#define all(a) (a).begin(),(a).end()
#define bit(s,i) (((s)>>(i))&1)
#define ii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define ll long long
#define _ << " " <<

template <class X, class Y> bool maxi(X &x, Y y){return x<y?x=y,true:false;}
template <class X, class Y> bool mini(X &x, Y y){return x>y?x=y,true:false;}

const int N=505;
const int INF=1e9;

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

int n,h,w;
char a[N][N];
ii go[N][N][4]; int vis[N][N][4];
int dp[N][N][9][9];

bool inBoard(int x, int y){
    return x>=0 && y>=0 && x<h && y<w;
}

ii cal(int x, int y, int dir){
    ii &res=go[x][y][dir];

    if(vis[x][y][dir]==1){
        return res=ii(-1,-1); /// means go infinity
    }
    if(vis[x][y][dir]==2){
        return res;
    }
    vis[x][y][dir]=1;

    int nwdir=dir;
    if(a[x][y]=='A') nwdir=(dir+3)%4;
    if(a[x][y]=='C') nwdir=(dir+1)%4;

    int nx=x+dx[nwdir], ny=y+dy[nwdir];
    if(!inBoard(nx,ny) || a[nx][ny]=='x'){
        res=ii(x,y);
    } else{
//        printf("Goes from (%d,%d,%d) -> (%d,%d,%d)\n",x,y,dir,nx,ny,dir);
        res=cal(nx,ny,nwdir);
    }
//    if(res==ii(0,0))cout<<x _ y _ dir<<'\n';
    vis[x][y][dir]=2;
    return res;
}

ii q[N*N]; int szq;
ii vt[N*N]; int szvt,uvt;
ii tp,v;

void dijkstra(int l, int r){
    szvt=0;
    rep(i,h) rep(j,w) if(a[i][j]!='x' && dp[i][j][l][r]<INF){
        vt[szvt++]=ii(i,j);
    }
    sort(vt, vt+szvt, [&](ii x, ii y){return dp[x.fi][x.se][l][r] < dp[y.fi][y.se][l][r];});

    uvt=0;
    while(szq>0 || uvt<szvt){
        if(uvt<szvt){
            auto [vx,vy]=vt[uvt];
            if(szq==0 || q[szq].fi>=dp[vx][vy][l][r]){
                q[++szq]=ii(vx,vy);
                ++uvt;
            }
        }

        tp=q[szq]; --szq;
        int ux=tp.fi, uy=tp.se, du=dp[ux][uy][l][r];
        if(du>dp[ux][uy][l][r]) continue;

        rep(d,4){
            v=cal(ux,uy,d);
//            if(l==2&&r==2){
//                cout<<ux _ uy _ v.fi _ v.se _ d<<'\n';
//            }
            if(v!=ii(-1,-1)){
                if(dp[v.fi][v.se][l][r]>du+1){
                    dp[v.fi][v.se][l][r]=du+1;
                    q[++szq]=v;
                }
            }
        }
    }
}

void solve(){
    cin>>n>>w>>h;
    rep(i,h) rep(j,w) cin>>a[i][j];

//    cal(2,0,1);
//    return;
    rep(i,h) rep(j,w) rep(l,n) foru(r,l,n-1) dp[i][j][l][r]=INF;
    rep(i,h) rep(j,w){
        if(a[i][j]>='1'&&a[i][j]<='9'){
//                cout<<i _ j _ a[i][j]-'1'<<'\n';
            dp[i][j][a[i][j]-'1'][a[i][j]-'1']=0;
        }
    }

    foru(len,1,n){
        rep(l,n){
            int r=l+len-1;
            if(r>=n) break;

            rep(i,h) rep(j,w) if(a[i][j]!='x'){
                foru(k,l,r-1){
                    mini(dp[i][j][l][r], dp[i][j][l][k]+dp[i][j][k+1][r]);
                }
            }
            dijkstra(l,r);
        }
    }

    int res=INF;
    rep(i,h) rep(j,w){
        mini(res,dp[i][j][0][n-1]);
    }

//    cout<<cal(1,6,0).fi _ cal(1,6,0).se<<'\n';
//    cout<<cal(4,4,1).fi _ cal(4,4,1).se<<'\n';
//    cout<<dp[0][6][2][2]<<'\n';
    cout<<(res>=(int)INF ? -1 : res)<<'\n';
}

int32_t main(){
    #define task "test"
    if(fopen(task".inp","r")){
        freopen(task".inp","r",stdin);
        freopen(task".out","w",stdout);
    }
    cin.tie(0)->sync_with_stdio(0);

    int tc=1; //cin>>tc;
    rep(i,tc){
        solve();
    }
}

Compilation message (stderr)

robots.cpp: In function 'int32_t main()':
robots.cpp:145:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  145 |         freopen(task".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
robots.cpp:146:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  146 |         freopen(task".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...