답안 #581514

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
581514 2022-06-22T17:20:10 Z ansol4328 로봇 (APIO13_robots) C++14
100 / 100
463 ms 152684 KB
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
 
using namespace std;
typedef long long ll;
typedef pair<short,short> P;
 
struct A{
    short y, x, dir;
};
 
int n, w, h;
string xy[505];
P nxt[505][505][4];
int dy[4]={-1,0,1,0};
int dx[4]={0,1,0,-1};
int D[10][10][505][505];
vector<P> nQ[250000*8+5];
const int INF=1e9;
 
void fastio(){
    ios_base::sync_with_stdio(false); cin.tie(NULL);
}
 
void get_nxt()
{
    queue<A> Q;
    for(int i=0 ; i<h ; i++){
        for(int j=0 ; j<w ; j++){
            if(xy[i][j]=='x') continue;
            for(int k=0 ; k<4 ; k++){
                nxt[i][j][k]=P(-1,-1);
                int ny=i+dy[k], nx=j+dx[k];
                if(ny<0 || ny>=h || nx<0 || nx>=w || xy[ny][nx]=='x'){
                    nxt[i][j][k]=P(i,j);
                    Q.push({(short)i,(short)j,(short)k});
                }
            }
        }
    }
    while(!Q.empty()){
        A v=Q.front(); Q.pop();
        P pr=nxt[v.y][v.x][v.dir];
        if(xy[v.y][v.x]=='A') v.dir=(v.dir+1)%4;
        else if(xy[v.y][v.x]=='C') v.dir=(v.dir+3)%4;
        v.dir=(v.dir+2)%4;
        v.y+=dy[v.dir], v.x+=dx[v.dir];
        if(v.y<0 || v.y>=h || v.x<0 || v.x>=w || xy[v.y][v.x]=='x') continue;
        v.dir=(v.dir+2)%4;
        nxt[v.y][v.x][v.dir]=pr; Q.push(v);
    }
}
 
void prop(int s, int e)
{
    vector<vector<bool>> chk(h,vector<bool>(w));
    int mn=INF, mx=0;
    for(int i=0 ; i<h ; i++){
        for(int j=0 ; j<w ; j++){
            if(D[s][e][i][j]!=-1){
                nQ[D[s][e][i][j]].pb(P(i,j));
                mn=min(mn,D[s][e][i][j]);
                mx=max(mx,D[s][e][i][j]);
            }
        }
    }
    while(mn<=mx){
        vector<P> &cur=nQ[mn];
        if(cur.empty()){
            vector<P>().swap(cur);
            mn++; continue;
        }
        P v=cur.back(); cur.pop_back();
        if(chk[v.fi][v.se]) continue;
        chk[v.fi][v.se]=true;
        for(int i=0 ; i<4 ; i++){
            if(nxt[v.fi][v.se][i]==P(-1,-1)) continue;
            P nv=nxt[v.fi][v.se][i];
            if(!chk[nv.fi][nv.se] && (D[s][e][nv.fi][nv.se]==-1 || D[s][e][nv.fi][nv.se]>D[s][e][v.fi][v.se]+1)){
                D[s][e][nv.fi][nv.se]=D[s][e][v.fi][v.se]+1;
                nQ[D[s][e][nv.fi][nv.se]].pb(nv);
                mx=max(mx,D[s][e][nv.fi][nv.se]);
            }
        }
    }
}
 
int main()
{
    fastio();
    cin >> n >> w >> h;
    for(int i=0 ; i<h ; i++) cin >> xy[i];
    get_nxt();
    memset(D,-1,sizeof(D));
    for(int i=0 ; i<h ; i++){
        for(int j=0 ; j<w ; j++){
            if(xy[i][j]>='1' && xy[i][j]<='9'){
                D[xy[i][j]-'0'][xy[i][j]-'0'][i][j]=0;
                prop(xy[i][j]-'0',xy[i][j]-'0');
            }
        }
    }
    /*
        for(int i=1, j=1 ; i<=n ; i++, j++){
            cout << "[ " << i << ' ' << j << " ]\n";
            for(int y=0 ; y<h ; y++){
                for(int x=0 ; x<w ; x++){
                    cout << D[i][j][y][x] << ' ';
                }
                cout << '\n';
            }
        }
    */
    for(int x=1 ; x<n ; x++){
        for(int i=1, j=1+x ; i+x<=n ; i++, j++){
            for(int c=i ; c<j ; c++){
                for(int y=0 ; y<h ; y++){
                    for(int x=0 ; x<w ; x++){
                        if(D[i][c][y][x]==-1 || D[c+1][j][y][x]==-1) continue;
                        if(D[i][j][y][x]==-1 || D[i][j][y][x]>D[i][c][y][x]+D[c+1][j][y][x]) D[i][j][y][x]=D[i][c][y][x]+D[c+1][j][y][x];
                    }
                }
            }
            prop(i,j);
            /*
            cout << "[ " << i << ' ' << j << " ]\n";
            for(int y=0 ; y<h ; y++){
                for(int x=0 ; x<w ; x++){
                    cout << D[i][j][y][x] << ' ';
                }
                cout << '\n';
            }
            */
        }
    }
    int ans=-1;
    for(int i=0 ; i<h ; i++) for(int j=0 ; j<w ; j++) if(D[1][n][i][j]!=-1 && (ans==-1 || ans>D[1][n][i][j])) ans=D[1][n][i][j];
    cout << ans;
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 61 ms 147084 KB Output is correct
2 Correct 61 ms 146980 KB Output is correct
3 Correct 66 ms 147116 KB Output is correct
4 Correct 69 ms 147060 KB Output is correct
5 Correct 59 ms 147024 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 61 ms 147084 KB Output is correct
2 Correct 61 ms 146980 KB Output is correct
3 Correct 66 ms 147116 KB Output is correct
4 Correct 69 ms 147060 KB Output is correct
5 Correct 59 ms 147024 KB Output is correct
6 Correct 60 ms 147020 KB Output is correct
7 Correct 63 ms 147080 KB Output is correct
8 Correct 63 ms 147044 KB Output is correct
9 Correct 64 ms 147088 KB Output is correct
10 Correct 60 ms 147140 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 61 ms 147084 KB Output is correct
2 Correct 61 ms 146980 KB Output is correct
3 Correct 66 ms 147116 KB Output is correct
4 Correct 69 ms 147060 KB Output is correct
5 Correct 59 ms 147024 KB Output is correct
6 Correct 60 ms 147020 KB Output is correct
7 Correct 63 ms 147080 KB Output is correct
8 Correct 63 ms 147044 KB Output is correct
9 Correct 64 ms 147088 KB Output is correct
10 Correct 60 ms 147140 KB Output is correct
11 Correct 123 ms 149908 KB Output is correct
12 Correct 72 ms 149840 KB Output is correct
13 Correct 76 ms 149708 KB Output is correct
14 Correct 204 ms 149836 KB Output is correct
15 Correct 101 ms 149780 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 61 ms 147084 KB Output is correct
2 Correct 61 ms 146980 KB Output is correct
3 Correct 66 ms 147116 KB Output is correct
4 Correct 69 ms 147060 KB Output is correct
5 Correct 59 ms 147024 KB Output is correct
6 Correct 60 ms 147020 KB Output is correct
7 Correct 63 ms 147080 KB Output is correct
8 Correct 63 ms 147044 KB Output is correct
9 Correct 64 ms 147088 KB Output is correct
10 Correct 60 ms 147140 KB Output is correct
11 Correct 123 ms 149908 KB Output is correct
12 Correct 72 ms 149840 KB Output is correct
13 Correct 76 ms 149708 KB Output is correct
14 Correct 204 ms 149836 KB Output is correct
15 Correct 101 ms 149780 KB Output is correct
16 Correct 119 ms 151280 KB Output is correct
17 Correct 463 ms 152684 KB Output is correct
18 Correct 155 ms 152228 KB Output is correct
19 Correct 115 ms 151388 KB Output is correct
20 Correct 312 ms 152488 KB Output is correct