#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define INF INT_MAX
#define output for(int i=0;i<sizex;i++) { for(int j=0;j<sizey;j++) { cout << moveChart[i][j] << " "; }cout<<endl; }cout<<endl;
struct el{
int x, y, m;
el(){}
el( int _x, int _y ){ x = _x; y = _y; }
el( int _x, int _y, int _m ){ x = _x; y = _y; m = _m; }
bool operator < ( const el &o ) const{
return m > o.m;
}
};
const int maxN = 1001;
int N, M;
char mat[maxN][maxN];
bool visited[maxN][maxN];
el startPos, endPos;
vector <el> portalPos[maxN][maxN];
int nearestWall[maxN][maxN];
int res;
priority_queue <el> pq;
bool isValid( int x, int y ){
return x >= 0 && x < N && y >= 0 && y < M;
}
bool wall( int x, int y ){
return x == -1 || y == -1 || x == N || y == M || mat[x][y] == '#';
}
void traverse( int Vx, int Vy, int m ){
int x, y;
x = Vx+1; y = Vy; if( !wall( x, y ) && !visited[x][y] ) pq.push( el( x, y, m+1 ) );
x = Vx-1; y = Vy; if( !wall( x, y ) && !visited[x][y] ) pq.push( el( x, y, m+1 ) );
x = Vx; y = Vy+1; if( !wall( x, y ) && !visited[x][y] ) pq.push( el( x, y, m+1 ) );
x = Vx; y = Vy-1; if( !wall( x, y ) && !visited[x][y] ) pq.push( el( x, y, m+1 ) );
}
void bfs( el V ){
while( !pq.empty() ) pq.pop();
pq.push(V);
while( !pq.empty() ){
V = pq.top();
pq.pop();
if( visited[V.x][V.y] ) continue;
visited[V.x][V.y] = true;
// cout << V.x << " " << V.y << " " << V.px << " " << V.py << " " << V.m << endl;
if( mat[V.x][V.y] == 'C' ){ res = V.m; return; }
traverse( V.x, V.y, V.m );
el _i;
for(int k=0;k<portalPos[V.x][V.y].size();k++){
_i = portalPos[V.x][V.y][k];
pq.push( el( _i.x, _i.y, V.m + nearestWall[V.x][V.y] ) );
}
}
}
priority_queue <el> q;
void wallBfs(){
el V;
while( !q.empty() ){
V = q.top();
q.pop();
if( nearestWall[V.x][V.y] <= V.m ) continue;
nearestWall[V.x][V.y] = V.m;
int x, y;
x = V.x+1; y = V.y; if( !wall( x, y ) && nearestWall[x][y] > V.m+1 ) q.push( el( x, y, V.m+1 ) );
x = V.x-1; y = V.y; if( !wall( x, y ) && nearestWall[x][y] > V.m+1 ) q.push( el( x, y, V.m+1 ) );
x = V.x; y = V.y+1; if( !wall( x, y ) && nearestWall[x][y] > V.m+1 ) q.push( el( x, y, V.m+1 ) );
x = V.x; y = V.y-1; if( !wall( x, y ) && nearestWall[x][y] > V.m+1 ) q.push( el( x, y, V.m+1 ) );
}
}
void findNearestWalls(){
for(int k=0;k<N;k++){
if( mat[k][0] != '#' ) q.push( el( k, 0, 1 ) );
if( mat[k][M-1] != '#' ) q.push( el( k, M-1, 1 ) );
}
for(int k=0;k<M;k++){
if( mat[0][k] != '#' ) q.push( el( 0, k, 1 ) );
if( mat[N-1][k] != '#' ) q.push( el( N-1, k, 1 ) );
}
for(int i=0;i<N;i++) for(int j=0;j<M;j++){
if( mat[i][j] != '#' ) continue;
q.push( el( i, j, 0 ) );
}
wallBfs();
}
int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
memset( visited, 0, sizeof visited );
cin >> N >> M;
for(int i=0;i<N;i++) for(int j=0;j<M;j++){
cin >> mat[i][j];
if( mat[i][j] == 'C' ){ endPos = el( i, j ); }
else if( mat[i][j] == 'S' ){ startPos = el( i, j ); }
}
for(int i=0;i<N;i++) for(int j=0;j<M;j++){
nearestWall[i][j] = INF;
if( mat[i][j] == '#' ) continue;
if( isValid( i+1, j ) && mat[i+1][j] != '#' ){
int k;
for(k=i+1;k<N;k++) if( mat[k][j] == '#' ) break;
portalPos[i][j].push_back( el( k-1, j ) );
}
if( isValid( i-1, j ) && mat[i-1][j] != '#' ){
int k;
for(k=i-1;k>=0;k--) if( mat[k][j] == '#' ) break;
portalPos[i][j].push_back( el( k+1, j ) );
}
if( isValid( i, j+1 ) && mat[i][j+1] != '#' ){
int k;
for(k=j+1;k<M;k++) if( mat[i][k] == '#' ) break;
portalPos[i][j].push_back( el( i, k-1 ) );
}
if( isValid( i, j-1 ) && mat[i][j-1] != '#' ){
int k;
for(k=j-1;k>=0;k--) if( mat[i][k] == '#' ) break;
portalPos[i][j].push_back( el( i, k+1 ) );
}
// cout << "FOR POS " << i << " , " << j << endl;
// for(int k=0;k<portalPos[i][j].size();k++){
// cout << "\t" << portalPos[i][j][k].x << " " << portalPos[i][j][k].y << endl;
// }
}
findNearestWalls();
res = -1;
bfs( el( startPos.x, startPos.y, 0 ) );
cout << res << endl;
}
Compilation message
portals.cpp: In function 'void bfs(el)':
portals.cpp:67:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int k=0;k<portalPos[V.x][V.y].size();k++){
~^~~~~~~~~~~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
24 ms |
24824 KB |
Output is correct |
2 |
Correct |
25 ms |
24956 KB |
Output is correct |
3 |
Correct |
24 ms |
24952 KB |
Output is correct |
4 |
Correct |
25 ms |
24952 KB |
Output is correct |
5 |
Correct |
24 ms |
24952 KB |
Output is correct |
6 |
Correct |
25 ms |
24952 KB |
Output is correct |
7 |
Correct |
24 ms |
24952 KB |
Output is correct |
8 |
Correct |
24 ms |
24952 KB |
Output is correct |
9 |
Correct |
24 ms |
24952 KB |
Output is correct |
10 |
Correct |
24 ms |
24824 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
24 ms |
24824 KB |
Output is correct |
2 |
Correct |
23 ms |
24824 KB |
Output is correct |
3 |
Correct |
23 ms |
24952 KB |
Output is correct |
4 |
Correct |
24 ms |
24824 KB |
Output is correct |
5 |
Correct |
25 ms |
24952 KB |
Output is correct |
6 |
Correct |
24 ms |
24908 KB |
Output is correct |
7 |
Correct |
24 ms |
24952 KB |
Output is correct |
8 |
Correct |
24 ms |
24932 KB |
Output is correct |
9 |
Correct |
27 ms |
25464 KB |
Output is correct |
10 |
Correct |
26 ms |
25464 KB |
Output is correct |
11 |
Correct |
25 ms |
25208 KB |
Output is correct |
12 |
Correct |
26 ms |
25208 KB |
Output is correct |
13 |
Correct |
26 ms |
25308 KB |
Output is correct |
14 |
Correct |
24 ms |
24824 KB |
Output is correct |
15 |
Correct |
26 ms |
25336 KB |
Output is correct |
16 |
Correct |
24 ms |
24952 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
24 ms |
24824 KB |
Output is correct |
2 |
Correct |
24 ms |
24952 KB |
Output is correct |
3 |
Correct |
24 ms |
24952 KB |
Output is correct |
4 |
Correct |
24 ms |
24952 KB |
Output is correct |
5 |
Correct |
48 ms |
27636 KB |
Output is correct |
6 |
Correct |
51 ms |
27764 KB |
Output is correct |
7 |
Correct |
50 ms |
28024 KB |
Output is correct |
8 |
Correct |
45 ms |
27632 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
25 ms |
24824 KB |
Output is correct |
2 |
Correct |
24 ms |
24952 KB |
Output is correct |
3 |
Correct |
28 ms |
24952 KB |
Output is correct |
4 |
Correct |
24 ms |
24952 KB |
Output is correct |
5 |
Correct |
25 ms |
24952 KB |
Output is correct |
6 |
Correct |
24 ms |
24952 KB |
Output is correct |
7 |
Correct |
24 ms |
24952 KB |
Output is correct |
8 |
Correct |
25 ms |
24900 KB |
Output is correct |
9 |
Correct |
27 ms |
25464 KB |
Output is correct |
10 |
Correct |
27 ms |
25464 KB |
Output is correct |
11 |
Correct |
26 ms |
25208 KB |
Output is correct |
12 |
Correct |
26 ms |
25336 KB |
Output is correct |
13 |
Correct |
27 ms |
25208 KB |
Output is correct |
14 |
Correct |
48 ms |
27608 KB |
Output is correct |
15 |
Correct |
51 ms |
27764 KB |
Output is correct |
16 |
Correct |
55 ms |
28020 KB |
Output is correct |
17 |
Correct |
52 ms |
28148 KB |
Output is correct |
18 |
Correct |
60 ms |
28528 KB |
Output is correct |
19 |
Correct |
59 ms |
28664 KB |
Output is correct |
20 |
Correct |
70 ms |
30108 KB |
Output is correct |
21 |
Correct |
49 ms |
27636 KB |
Output is correct |
22 |
Correct |
55 ms |
27636 KB |
Output is correct |
23 |
Correct |
50 ms |
27764 KB |
Output is correct |
24 |
Correct |
93 ms |
29292 KB |
Output is correct |
25 |
Correct |
30 ms |
24952 KB |
Output is correct |
26 |
Correct |
33 ms |
25336 KB |
Output is correct |
27 |
Correct |
25 ms |
24952 KB |
Output is correct |
28 |
Correct |
54 ms |
27636 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
24 ms |
24824 KB |
Output is correct |
2 |
Correct |
25 ms |
24952 KB |
Output is correct |
3 |
Correct |
30 ms |
24952 KB |
Output is correct |
4 |
Correct |
25 ms |
24824 KB |
Output is correct |
5 |
Correct |
25 ms |
24952 KB |
Output is correct |
6 |
Correct |
25 ms |
24952 KB |
Output is correct |
7 |
Correct |
26 ms |
24952 KB |
Output is correct |
8 |
Correct |
25 ms |
24952 KB |
Output is correct |
9 |
Correct |
28 ms |
25464 KB |
Output is correct |
10 |
Correct |
28 ms |
25464 KB |
Output is correct |
11 |
Correct |
31 ms |
25208 KB |
Output is correct |
12 |
Correct |
33 ms |
25384 KB |
Output is correct |
13 |
Correct |
32 ms |
25336 KB |
Output is correct |
14 |
Correct |
59 ms |
27636 KB |
Output is correct |
15 |
Correct |
56 ms |
27764 KB |
Output is correct |
16 |
Correct |
51 ms |
28020 KB |
Output is correct |
17 |
Correct |
59 ms |
28024 KB |
Output is correct |
18 |
Correct |
67 ms |
28532 KB |
Output is correct |
19 |
Correct |
61 ms |
28596 KB |
Output is correct |
20 |
Correct |
75 ms |
30108 KB |
Output is correct |
21 |
Correct |
48 ms |
27636 KB |
Output is correct |
22 |
Correct |
49 ms |
27636 KB |
Output is correct |
23 |
Correct |
50 ms |
27760 KB |
Output is correct |
24 |
Correct |
963 ms |
80400 KB |
Output is correct |
25 |
Execution timed out |
1072 ms |
55980 KB |
Time limit exceeded |
26 |
Halted |
0 ms |
0 KB |
- |