Problem
Problem URL : 탈출
[1] Answer Code (18. 02. 05)
#include<iostream>
#include<queue>
using namespace std;
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
char map[51][51];
int n,m;
queue<pair<int,int>> w_q;
queue<pair<int,int>> s_q;
int main(){
pair<int, int> d; // d is Destination
cin >> n >> m;
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
char c;
scanf(" %c", &c);
if( c == '*'){
map[i][j] = '*';
w_q.push({i,j});
}
else if ( c == 'S'){
map[i][j] = 'S';
s_q.push({i,j});
}
else if ( c == 'D'){
map[i][j] = 'D';
d = {i,j};
}
else if ( c == 'X'){
map[i][j] = 'X';
}
else
map[i][j] = '.';
}
}
int ans=0;
while (! s_q.empty()) {
int nx,ny;
int w_size = (int) w_q.size();
int s_size = (int) s_q.size();
ans ++;
for(int i=0; i<s_size; i++){
int s_x = s_q.front().first;
int s_y = s_q.front().second;
s_q.pop();
if( map[s_x][s_y] != 'S') continue;
for(int j=0; j<4; j++){
nx = s_x + dx[j];
ny = s_y + dy[j];
if( map[nx][ny] == '.' ){
map[nx][ny] = 'S';
s_q.push({nx,ny});
}
if( map[nx][ny] == 'D'){
cout << ans << endl;
return 0;
}
}
}
for(int i=0; i<w_size; i++){
int w_x = w_q.front().first;
int w_y = w_q.front().second;
w_q.pop();
for(int j=0; j<4; j++){
nx = w_x + dx[j];
ny = w_y + dy[j];
if( map[nx][ny] == '.' || map[nx][ny] == 'S' ){
map[nx][ny] = '*';
w_q.push({nx,ny});
}
}
}
}
cout << "KAKTUS" << endl;
return 0;
}
Review
-
알쿡 대회에 출제되었던 구현 문제
-
대회 때 시간이 없어서 아예 보지도 못했던 문제
-
BFS + 구현문제이다.
-
한 번에 풀었는데 너무나 뿌듯하더라 그리고 이런 문제 무서워서 포기하려 했는데 포기 안하길 잘했다 !