Submission #261195

# Submission time Handle Problem Language Result Execution time Memory
261195 2020-08-11T14:02:20 Z brcode Robots (APIO13_robots) C++14
30 / 100
1500 ms 55668 KB
#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 time Memory Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 1 ms 512 KB Output is correct
5 Correct 1 ms 512 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 1 ms 512 KB Output is correct
5 Correct 1 ms 512 KB Output is correct
6 Correct 1 ms 384 KB Output is correct
7 Correct 0 ms 384 KB Output is correct
8 Correct 1 ms 384 KB Output is correct
9 Correct 1 ms 384 KB Output is correct
10 Correct 1 ms 512 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 1 ms 512 KB Output is correct
5 Correct 1 ms 512 KB Output is correct
6 Correct 1 ms 384 KB Output is correct
7 Correct 0 ms 384 KB Output is correct
8 Correct 1 ms 384 KB Output is correct
9 Correct 1 ms 384 KB Output is correct
10 Correct 1 ms 512 KB Output is correct
11 Execution timed out 1588 ms 55668 KB Time limit exceeded
12 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 1 ms 512 KB Output is correct
5 Correct 1 ms 512 KB Output is correct
6 Correct 1 ms 384 KB Output is correct
7 Correct 0 ms 384 KB Output is correct
8 Correct 1 ms 384 KB Output is correct
9 Correct 1 ms 384 KB Output is correct
10 Correct 1 ms 512 KB Output is correct
11 Execution timed out 1588 ms 55668 KB Time limit exceeded
12 Halted 0 ms 0 KB -