Submission #625895

#TimeUsernameProblemLanguageResultExecution timeMemory
625895goodluck2020Portals (BOI14_portals)C++14
100 / 100
352 ms37692 KiB
#include <bits/stdc++.h> #define task "SNAKE" using namespace std; const int N = 1e3 + 5; int n, m, A[N][N]; struct Data { int x, y; } S, C, D; int dx[] = {0, 0, 1, -1}; int dy[] = {1, -1, 0, 0}; struct Data2 { int x, y, w; } P; struct cmp { bool operator() (Data2 A, Data2 B) { return A.w > B.w; } }; int Up[N][N], Down[N][N], Left[N][N], Right[N][N]; void init() { for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++) { Left[i][j] = Left[i][j-1] + 1; if(A[i][j] == 0) Left[i][j] = 0; } for(int j = m; j >= 1; j--) { Right[i][j] = Right[i][j + 1] + 1; if(A[i][j] == 0) Right[i][j] = 0; } } for(int j = 1; j <= m; j++) { for(int i = 1; i <= n; i++) { Up[i][j] = Up[i-1][j] + 1; if(A[i][j] == 0) Up[i][j] = 0; } for(int i = n; i >= 1; i--) { Down[i][j] = Down[i + 1][j] + 1; if(A[i][j] == 0) Down[i][j] = 0; } } } priority_queue < Data2, vector < Data2 > , cmp > pq; namespace sub5 { queue < Data > Q; int Visited[N][N], dist[N][N], wall[N][N]; void Build() { for(int i = 0; i <= n + 1; i++) for(int j = 0; j <= m + 1; j++) if(A[i][j] == 0) Q.push({i, j}), Visited[i][j] = 1; while(!Q.empty()) { Data D = Q.front(); Q.pop(); for(int i = 0; i < 4; i++) { int x = D.x + dx[i]; int y = D.y + dy[i]; if(A[x][y] && !Visited[x][y]) { Q.push({x, y}); wall[x][y] = wall[D.x][D.y] + 1; Visited[x][y] = 1; } } } for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) Visited[i][j] = 0, dist[i][j] = 1e9; } void Go(int x, int y, int cost) { if(dist[x][y] <= dist[P.x][P.y] + cost) return; dist[x][y] = dist[P.x][P.y] + cost; pq.push({x, y, dist[x][y]}); } void solve() { Build(); pq.push({S.x, S.y, 0}); dist[S.x][S.y] = 0; while(!pq.empty()) { P = pq.top(); pq.pop(); for(int i = 0; i < 4; i++) { int x = P.x + dx[i]; int y = P.y + dy[i]; if(A[x][y]) Go(x, y, 1); } int x, y; x = P.x - (Up[P.x][P.y] - 1); y = P.y; Go(x, y, wall[P.x][P.y]); x = P.x + (Down[P.x][P.y] - 1); y = P.y; Go(x, y, wall[P.x][P.y]); x = P.x; y = P.y - (Left[P.x][P.y] - 1); Go(x, y, wall[P.x][P.y]); x = P.x; y = P.y + (Right[P.x][P.y] - 1); Go(x, y, wall[P.x][P.y]); } cout << dist[C.x][C.y]; } } int main() { if(fopen(task ".inp","r")) { freopen(task ".inp","r",stdin); freopen(task ".out","w",stdout); } 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++) { char ch; cin >> ch; if(ch == 'S') S = {i, j}; if(ch == 'C') C = {i, j}; if(ch != '#') A[i][j] = 1; } init(); sub5::solve(); }

Compilation message (stderr)

portals.cpp: In function 'int main()':
portals.cpp:119:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  119 |         freopen(task ".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
portals.cpp:120:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  120 |         freopen(task ".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#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...