제출 #30903

#제출 시각아이디문제언어결과실행 시간메모리
30903Navick포탈들 (BOI14_portals)C++14
70 / 100
1000 ms113404 KiB
#include <bits/stdc++.h> #define F first #define S second #define pii pair<int, int> #define pb push_back #define end EEE using namespace std; typedef long long ll; typedef long double ld; const int N = 1010, INF = 1e9; const int dx[4] = {1, 0, -1, 0}; const int dy[4] = {0, 1, 0, -1}; //down,right,up,left. int d[N][N], dis[N][N]; pii start, end, que[N * N], nex[4][N][N]; bool mp[N][N]; char sr[N]; set<pair<int, pii> > s; int main(){ int n, m; scanf("%d %d",&n ,&m); for(int i=1; i<=n; i++){ scanf("%s", sr); for(int j=1; j<=m; j++){ if(sr[j - 1] == '.'){ mp[i][j] = true; d[i][j] = INF; } else if(sr[j - 1] == 'S'){ mp[i][j] = true; d[i][j] = INF; start = {i, j}; }else if(sr[j - 1] == 'C'){ mp[i][j] = true; d[i][j] = INF; end = {i, j}; } } } int st = 0, en = 0; for(int i=0; i<=n+1; i++) for(int j=0; j<=m+1; j++) if(!mp[i][j]) que[en++] = {i, j}; while(en - st){ pii v = que[st++]; int x = v.F, y = v.S; for(int i=0; i<4; i++){ int nx = x + dx[i], ny = y + dy[i]; if(nx < 0 || nx > n + 1 || ny < 0 || ny > m + 1)continue; if(d[nx][ny] == INF){ d[nx][ny] = d[x][y] + 1; que[en++] = {nx, ny}; } } } for(int i=n+1; i>=0; i--) for(int j=m+1; j>=0; j--){ if(!mp[i][j])continue; for(int c=0; c<2; c++){ int nx = i + dx[c], ny = j + dy[c]; if(nx < 0 || nx > n + 1 || ny < 0 || ny > m + 1)continue; if(mp[nx][ny]) nex[c][i][j] = nex[c][nx][ny]; else nex[c][i][j] = {i, j}; } } for(int i=0; i<=n+1; i++){ for(int j=0; j<=m+1; j++){ if(!mp[i][j])continue; for(int c=2; c<4; c++){ int nx = i + dx[c], ny = j + dy[c]; if(nx < 0 || nx > n + 1 || ny < 0 || ny > m + 1)continue; if(mp[nx][ny]) nex[c][i][j] = nex[c][nx][ny]; else nex[c][i][j] = {i, j}; } } } //dijkstra :) for(int i=0; i<=n+1; i++) for(int j=0; j<=m+1; j++){ if(!mp[i][j])continue; dis[i][j] = INF; if(i != start.F || j != start.S) s.insert({dis[i][j], {i, j}}); } dis[start.F][start.S] = 0; s.insert({0, start}); while(!s.empty()){ auto X = *(s.begin()); s.erase(s.begin()); int res = X.F; int x = X.S.F, y = X.S.S; if(x == end.F && y == end.S) return printf("%d\n", res), 0; for(int i=0; i<4; i++){ int nx = x + dx[i], ny = y + dy[i]; if(nx < 0 || nx > n + 1 || ny < 0 || ny > m + 1)continue; if(!mp[nx][ny])continue; if(dis[nx][ny] > res + 1){ s.erase({dis[nx][ny], {nx, ny}}); dis[nx][ny] = res + 1; s.insert({dis[nx][ny], {nx, ny}}); } } for(int i=0; i<4; i++){ int nx = nex[i][x][y].F, ny = nex[i][x][y].S; if(dis[nx][ny] > res + d[x][y]){ s.erase({dis[nx][ny], {nx, ny}}); dis[nx][ny] = res + d[x][y]; s.insert({dis[nx][ny], {nx, ny}}); } } } }

컴파일 시 표준 에러 (stderr) 메시지

portals.cpp: In function 'int main()':
portals.cpp:27:33: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  int n, m; scanf("%d %d",&n ,&m);
                                 ^
portals.cpp:29:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%s", sr);
                  ^
#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...