2206번: 벽 부수고 이동하기
N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로
www.acmicpc.net
이동한 거리를 출력해야하기 때문에 BFS 사용
3차원 배열 사용 block[x][y][벽 부셨는지] 0: 벽을 안부숨 / 1: 벽을 부숨
두 가지로 판단
1. 다음 이동하는 위치에 벽이 없는 경우 -> 그대로 탐색 진행
2. 다음 위치에 벽이 있고 , 벽을 아직 한 번도 부시지 않은 경우 -> 벽을 부셨다고 표시
while문을 돌면서 x,y좌표가 n-1, m-1에 도달한 경우 그 때의 이동거리를 리턴해준다.
=> 시작을 0,0으로 진행했기 때문에 n-1, m-1에 도달한 것을 조건으로 세웠다.
#include <bits/stdc++.h>
using namespace std;
int n,m;
string board[1001];
int block[1001][1001][2];
struct asda
{
int x,y,z;
};
int dx[4] ={0,1,0,-1};
int dy[4] = {1,0,-1,0};
int bfs(){
queue<asda> que;
block[0][0][0]=1;
que.push({0,0,0});
while(!que.empty()){
int x = que.front().x;
int y = que.front().y;
int z = que.front().z;
que.pop();
if(x == n-1 && y == m-1) return block[x][y][z];
for(int i=0; i<4; i++){
int nx = x+dx[i];
int ny = y+dy[i];
if(nx<0 || nx>=n || ny<0 || ny>=m) continue;
if(block[nx][ny][z]) continue;
if(board[nx][ny]=='1' && z == 0 ){
que.push({nx,ny,z+1});
block[nx][ny][z+1] = block[x][y][z]+1;
}
else if(board[nx][ny]=='0'){
que.push({nx,ny,z});
block[nx][ny][z] = block[x][y][z] +1;
}
}
}
return -1;
}
int main(void){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m;
for(int i=0; i<n; i++){
cin>>board[i];
}
cout<<bfs()<<"\n";
}
'Algorithm > BOJ' 카테고리의 다른 글
[c++] 백준 14467 소가 길을 건너간 이유1 (0) | 2021.03.29 |
---|---|
[c++] 백준 14940 쉬운 최단거리 (0) | 2021.03.26 |
[c++] 백준 13023 ABCDE (0) | 2021.03.24 |
[c++] 백준 1463 1로 만들기 (2) | 2021.03.12 |
[c++] 백준 1655 가운데를 말해요 (0) | 2021.03.12 |