Submission #97093

# Submission time Handle Problem Language Result Execution time Memory
97093 2019-02-13T20:07:47 Z dalgerok Portals (BOI14_portals) C++14
31 / 100
1000 ms 6840 KB
#include<bits/stdc++.h>
using namespace std;


const int N = 1005,
          INF = 1e9,
          dx[] = {-1, 0, 1, 0},
          dy[] = {0, -1, 0, 1};


int n, m;
char a[N][N];
int dist_to_wall[N][N], d[N][N];
int sx, sy, tx, ty;
pair < int, int > nxt[4][N][N];

inline bool is_wall(int x, int y){
    return x < 1 || x > n || y < 1 || y > m || a[x][y] == '#';
}

void walls(){
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            dist_to_wall[i][j] = INF;
        }
    }
    queue < pair < int, int > > q;
    for(int i = 0; i <= n + 1; i++){
        for(int j = 0; j <= m + 1; j++){
            if(is_wall(i, j)){
                dist_to_wall[i][j] = 0;
                q.push(make_pair(i, j));
            }
        }
    }
    while(!q.empty()){
        int x = q.front().first,
            y = q.front().second;
        q.pop();
        for(int i = 0; i < 4; i++){
            int xx = x + dx[i],
                yy = y + dy[i];
            if(is_wall(xx, yy)){
                continue;
            }
            if(dist_to_wall[xx][yy] > dist_to_wall[x][y] + 1){
                dist_to_wall[xx][yy] = dist_to_wall[x][y] + 1;
                q.push(make_pair(xx, yy));
            }
        }
    }
}

int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin >> n >> m;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            cin >> a[i][j];
        }
    }
    walls();
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            if(j == 1 || a[i][j - 1] == '#'){
                nxt[0][i][j] = make_pair(i, j);
            }
            else{
                nxt[0][i][j] = nxt[0][i][j - 1];
            }
            if(i == 1 || a[i - 1][j] == '#'){
                nxt[1][i][j] = make_pair(i, j);
            }
            else{
                nxt[1][i][j] = nxt[1][i - 1][j];
            }
        }
    }
    for(int i = n; i >= 1; i--){
        for(int j = m; j >= 1; j--){
            if(j == m || a[i][j + 1] == '#'){
                nxt[2][i][j] = make_pair(i, j);
            }
            else{
                nxt[2][i][j] = nxt[2][i][j + 1];
            }
            if(i == n || a[i + 1][j] == '#'){
                nxt[3][i][j] = make_pair(i, j);
            }
            else{
                nxt[3][i][j] = nxt[3][i + 1][j];
            }
        }
    }
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            d[i][j] = INF;
            if(a[i][j] == 'S'){
                sx = i;
                sy = j;
            }
            else if(a[i][j] == 'C'){
                tx = i;
                ty = j;
            }
        }
    }
    /**for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            cout << dist_to_wall[i][j] << " ";
        }
        cout << "\n";
    }*/
    priority_queue < pair < int, pair < int, int > > > q;
    d[sx][sy] = 0;
    q.push(make_pair(0, make_pair(sx, sy)));
    while(!q.empty()){
        int val = q.top().first,
            x = q.top().second.first,
            y = q.top().second.second;
        q.pop();
        if(d[x][y] < val){
            continue;
        }
        for(int i = 0; i < 4; i++){
            int xx = x + dx[i],
                yy = y + dy[i];
            if(!is_wall(xx, yy) && d[xx][yy] > d[x][y] + 1){
                d[xx][yy] = d[x][y] + 1;
                q.push(make_pair(d[xx][yy], make_pair(xx, yy)));
            }
        }
        for(int i = 0; i < 4; i++){
            int xx = nxt[i][x][y].first,
                yy = nxt[i][x][y].second;
            if(d[xx][yy] > d[x][y] + dist_to_wall[x][y]){
                d[xx][yy] = d[x][y] + dist_to_wall[x][y];
                q.push(make_pair(d[xx][yy], make_pair(xx, yy)));
            }
        }
    }
    cout << d[tx][ty];
}
# Verdict Execution time Memory Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 3 ms 640 KB Output is correct
3 Correct 2 ms 640 KB Output is correct
4 Correct 3 ms 512 KB Output is correct
5 Correct 2 ms 640 KB Output is correct
6 Correct 2 ms 640 KB Output is correct
7 Correct 3 ms 640 KB Output is correct
8 Correct 2 ms 640 KB Output is correct
9 Correct 2 ms 512 KB Output is correct
10 Correct 2 ms 512 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 3 ms 640 KB Output is correct
3 Correct 3 ms 640 KB Output is correct
4 Correct 2 ms 512 KB Output is correct
5 Correct 2 ms 640 KB Output is correct
6 Correct 3 ms 640 KB Output is correct
7 Correct 2 ms 640 KB Output is correct
8 Correct 2 ms 640 KB Output is correct
9 Correct 67 ms 1792 KB Output is correct
10 Correct 51 ms 1664 KB Output is correct
11 Correct 4 ms 1664 KB Output is correct
12 Correct 18 ms 1664 KB Output is correct
13 Correct 39 ms 1664 KB Output is correct
14 Correct 2 ms 512 KB Output is correct
15 Correct 24 ms 1792 KB Output is correct
16 Correct 2 ms 512 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 2 ms 640 KB Output is correct
3 Correct 2 ms 640 KB Output is correct
4 Correct 2 ms 640 KB Output is correct
5 Correct 48 ms 6756 KB Output is correct
6 Execution timed out 1070 ms 6704 KB Time limit exceeded
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 2 ms 640 KB Output is correct
3 Correct 2 ms 640 KB Output is correct
4 Correct 2 ms 512 KB Output is correct
5 Correct 3 ms 640 KB Output is correct
6 Correct 2 ms 640 KB Output is correct
7 Correct 3 ms 640 KB Output is correct
8 Correct 3 ms 640 KB Output is correct
9 Correct 69 ms 1760 KB Output is correct
10 Correct 47 ms 1664 KB Output is correct
11 Correct 4 ms 1664 KB Output is correct
12 Correct 20 ms 1664 KB Output is correct
13 Correct 40 ms 1664 KB Output is correct
14 Correct 44 ms 6712 KB Output is correct
15 Execution timed out 1082 ms 6704 KB Time limit exceeded
16 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 3 ms 640 KB Output is correct
3 Correct 3 ms 640 KB Output is correct
4 Correct 2 ms 512 KB Output is correct
5 Correct 2 ms 768 KB Output is correct
6 Correct 3 ms 640 KB Output is correct
7 Correct 3 ms 640 KB Output is correct
8 Correct 2 ms 640 KB Output is correct
9 Correct 67 ms 1784 KB Output is correct
10 Correct 39 ms 1744 KB Output is correct
11 Correct 3 ms 1664 KB Output is correct
12 Correct 19 ms 1664 KB Output is correct
13 Correct 46 ms 1664 KB Output is correct
14 Correct 54 ms 6840 KB Output is correct
15 Execution timed out 1076 ms 6704 KB Time limit exceeded
16 Halted 0 ms 0 KB -