Submission #261195

#TimeUsernameProblemLanguageResultExecution timeMemory
261195brcodeRobots (APIO13_robots)C++14
30 / 100
1588 ms55668 KiB
#include <iostream> #include <bits/stdc++.h> using namespace std; const int MAXN = 510; bool blocked[MAXN][MAXN]; int dp[MAXN][MAXN][12][12]; bool cw[MAXN][MAXN]; bool anticw[MAXN][MAXN]; int n,h,w; int dx[6] = {0,0,1,0,-1}; int dy[6] = {0,1,0,-1,0}; priority_queue<pair<int,pair<int,int>>> pq; pair<int,int> visited[MAXN][MAXN][5]; pair<int,int> bot[20]; bool check(int i,int j){ if(i<=0||j<=0||i>w||j>h||blocked[i][j]){ return false; } return true; } pair<int,int> dfs(int i,int j,int dir){ if(visited[i][j][dir]!=make_pair(0,0)){ return visited[i][j][dir]; } if(!anticw[i][j] && !cw[i][j]){ int nexti = i+dx[dir]; int nextj = j+dy[dir]; if(check(nexti,nextj)){ return visited[i][j][dir] = dfs(nexti,nextj,dir); }else{ return make_pair(i,j); } } if(anticw[i][j]){ int newdir = dir; newdir--; if(newdir == 0){ newdir = 4; } int nexti = i+dx[newdir]; int nextj = j+dy[newdir]; if(check(nexti,nextj)){ return visited[i][j][dir] = dfs(nexti,nextj,newdir); }else{ return make_pair(i,j); } } if(cw[i][j]){ int newdir = dir; newdir++; if(newdir == 5){ newdir = 1; } int nexti = i+dx[newdir]; int nextj = j+dy[newdir]; if(check(nexti,nextj)){ return visited[i][j][dir] = dfs(nexti,nextj,newdir); }else{ return make_pair(i,j); } } return make_pair(0,0); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin>>n>>w>>h; swap(w,h); for(int i=1;i<=w;i++){ for(int j=1;j<=h;j++){ char x; cin>>x; if(x=='.'){ continue; } if(x=='x'){ blocked[i][j] = true; continue; } if(x=='A'){ anticw[i][j] = true; continue; } if(x=='C'){ cw[i][j] = true; continue; } int y = x-'0'; bot[y] = make_pair(i,j); } } for(int i=1;i<=w;i++){ for(int j=1;j<=h;j++){ for(int x=1;x<=n;x++){ for(int y=1;y<=n;y++){ dp[i][j][x][y] = 1e9; } } } } for(int i=1;i<=n;i++){ dp[bot[i].first][bot[i].second][i][i] = 0; // cout<<i<<" "<<bot[i].first<<" "<<bot[i].second<<endl; } for(int i=1;i<=w;i++){ for(int j=1;j<=h;j++){ if(blocked[i][j]){ continue; } if(visited[i][j][1]== make_pair(0,0)){ dfs(i,j,1); } if(visited[i][j][2]== make_pair(0,0)){ dfs(i,j,2); } if(visited[i][j][3]== make_pair(0,0)){ dfs(i,j,3); } if(visited[i][j][4]== make_pair(0,0)){ dfs(i,j,4); } } } //cout<<visited[5][5][1].first<<" "<<visited[5][5][1].second<<endl; for(int len=0;len<=n-1;len++){ for(int x=1;x<=n;x++){ int y = x+len; if(y>n){ break; } for(int i=1;i<=w;i++){ for(int j=1;j<=h;j++){ for(int z=x;z<y;z++){ if(i==1 && j==1 && x==1 && y==4 && z==2){ //cout<<dp[i][j][z+1][y]<<endl; } dp[i][j][x][y] = min(dp[i][j][x][y],dp[i][j][x][z]+dp[i][j][z+1][y]); } } } while(pq.size()){ pq.pop(); } for(int i=1;i<=w;i++){ for(int j=1;j<=h;j++){ if(dp[i][j][x][y]!=1e9){ pq.push(make_pair(dp[i][j][x][y],make_pair(i,j))); } } } while(!pq.empty()){ auto hold = pq.top().second; if(dp[hold.first][hold.second][x][y] !=pq.top().first){ pq.pop(); continue; } pq.pop(); for(int dir=1;dir<=4;dir++){ int nxti = visited[hold.first][hold.second][dir].first; int nxtj = visited[hold.first][hold.second][dir].second; if(nxti == hold.first && nxtj == hold.second){ continue; } if(nxti == 0 && nxtj == 0){ continue; } if(dp[nxti][nxtj][x][y]>dp[hold.first][hold.second][x][y]+1){ dp[nxti][nxtj][x][y] = dp[hold.first][hold.second][x][y]+1; pq.push(make_pair(dp[nxti][nxtj][x][y],make_pair(nxti,nxtj))); } } } } } //cout<<visited[1][7][3].first<<" "<<visited[1][7][3].second<<endl; // cout<<dp[1][7][3][4]<<endl; int ans = 1e9; for(int i=1;i<=w;i++){ for(int j=1;j<=h;j++){ ans = min(ans,dp[i][j][1][n]); } } if(ans == 1e9){ ans = -1; } cout<<ans<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...