Submission #1095729

#TimeUsernameProblemLanguageResultExecution timeMemory
1095729SoMotThanhXuanPortals (BOI14_portals)C++17
20 / 100
25 ms29788 KiB
#include <bits/stdc++.h>
using namespace std;

int R, C;
const int dx[4] = {0, 0, 1, -1};
const int dy[4] = {1, -1, 0, 0};
const int maxN = 1e3 + 2;
char a[1001][1001];
int val[1001][1001];
vector<int> adj[1000001];
int rem[1002];
#define up fdoisofds
#define down odshfod
#define left ofdFDSJAO
#define right fioiofsiosdoisio
int up[1001][1001], down[1001][1001], left[1001][1001], right[1001][1001];
pair<int, int> td[1000001];
int f[1000001];
bool isValid(int i, int j){
    return i >= 1 && i <= R && j >= 1 && j <= C && a[i][j] != '#';
}
int main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin >> R >> C;
    int cnt = 0;
    for(int i = 1; i <= R; ++i){
        for(int j = 1; j <= C; ++j){
            cin >> a[i][j];
            val[i][j] = ++cnt;
            td[cnt] = {i, j};
        }
    }
    for(int j = 1; j <= C; ++j){
        for(int i = 1; i <= R; ++i){
            if(a[i][j] == '#'){
                rem[i] = i;
                continue;
            }
            rem[i] = rem[i - 1];
            up[i][j] = val[rem[i] + 1][j];
        }
        rem[R + 1] = R + 1;
        for(int i = R; i >= 1; --i){
            if(a[i][j] == '#'){
                rem[i] = i;
                continue;
            }
            rem[i] = rem[i + 1];
            down[i][j] = val[rem[i] - 1][j];
        }
    }
    for(int i = 1; i <= R; ++i){
        for(int j = 1; j <= C; ++j){
            if(a[i][j] == '#'){
                rem[j] = j;
                continue;
            }
            rem[j] = rem[j - 1];
            left[i][j] = val[i][rem[j] + 1];
        }
        rem[C + 1] = C + 1;
        for(int j = C; j >= 1; --j){
            if(a[i][j] == '#'){
                rem[j] = j;
                continue;
            }
            rem[j] = rem[j + 1];
            right[i][j] = val[i][rem[j] - 1];
        }
    }
    for(int i = 1; i <= R; ++i){
        for(int j = 1; j <= C; ++j){
            if(a[i][j] == '#')continue;
            int cur = val[i][j];
            for(int k = 0; k < 4; ++k){
                int ni = i + dx[k];
                int nj = j + dy[k];
                if(ni >= 1 && ni <= R && nj >= 1 && nj <= C){
                    if(a[ni][nj] != '#')adj[cur].push_back(val[ni][nj]);
                    else if(a[ni][nj] == '#'){
                        if(k == 0){
                            if(up[i][j])adj[cur].push_back(up[i][j]);
                            if(left[i][j])adj[cur].push_back(left[i][j]);
                            if(down[i][j])adj[cur].push_back(down[i][j]);
                        }else if(k == 1){
                            if(up[i][j])adj[cur].push_back(up[i][j]);
                            if(right[i][j])adj[cur].push_back(right[i][j]);
                            if(down[i][j])adj[cur].push_back(down[i][j]);
                        }else if(k == 2){
                            if(up[i][j])adj[cur].push_back(up[i][j]);
                            if(left[i][j])adj[cur].push_back(left[i][j]);
                            if(right[i][j])adj[cur].push_back(right[i][j]);
                        }else{
                            if(right[i][j])adj[cur].push_back(right[i][j]);
                            if(left[i][j])adj[cur].push_back(left[i][j]);
                            if(down[i][j])adj[cur].push_back(down[i][j]);
                        }
                    }
                }
                else{
                    if(k == 0){
                        if(up[i][j])adj[cur].push_back(up[i][j]);
                        if(left[i][j])adj[cur].push_back(left[i][j]);
                        if(down[i][j])adj[cur].push_back(down[i][j]);
                    }else if(k == 1){
                        if(up[i][j])adj[cur].push_back(up[i][j]);
                        if(right[i][j])adj[cur].push_back(right[i][j]);
                        if(down[i][j])adj[cur].push_back(down[i][j]);
                    }else if(k == 2){
                        if(up[i][j])adj[cur].push_back(up[i][j]);
                        if(left[i][j])adj[cur].push_back(left[i][j]);
                        if(right[i][j])adj[cur].push_back(right[i][j]);
                    }else{
                        if(right[i][j])adj[cur].push_back(right[i][j]);
                        if(left[i][j])adj[cur].push_back(left[i][j]);
                        if(down[i][j])adj[cur].push_back(down[i][j]);
                    }
                }
            }
        }
    }
    const int INF = 1e9 + 9;
    int s, e;
    for(int i = 1; i <= R; ++i)for(int j = 1; j <= C; ++j)if(a[i][j] == 'S')s = val[i][j]; else if(a[i][j] == 'C') e = val[i][j];
    for(int i = 1; i <= cnt; ++i)f[i] = INF;
    f[s] = 0;
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> Q;
    Q.push({0, s});
    while(!Q.empty()){
        int p = Q.top().second;
        int dis = Q.top().first;
        Q.pop();
        if(dis > f[p])continue;
        for(int v: adj[p]){
            if(f[v] > f[p] + 1){
                f[v] = f[p] + 1;
                Q.push({f[v], v});
            }
        }
    }
    cout << f[e];
    return 0;
}

Compilation message (stderr)

portals.cpp: In function 'int main()':
portals.cpp:141:16: warning: 'e' may be used uninitialized in this function [-Wmaybe-uninitialized]
  141 |     cout << f[e];
      |                ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...