문제
https://www.acmicpc.net/problem/14442
걸린 시간
00 : 34 : 39
풀이
C++
#include <bits/stdc++.h>
#define INF 1e9
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int n, m, k;
int dy[4] = {-1, 1, 0, 0};
int dx[4] = {0, 0, -1, 1};
vector<vector<int>> maze;
vector<vector<vector<int>>> visited;
struct node{
int y, x, broke;
node(int y, int x, int broke){
this->y = y;
this->x = x;
this->broke = broke;
}
};
int bfs(){
visited.resize(n, vector<vector<int>>(m, vector<int>(k+1, 0)));
queue<node> q;
q.push(node(0, 0, 0));
visited[0][0][0] = 1;
int depth = 0;
while(!q.empty()){
depth++;
int size = q.size();
for(int i = 0; i < size; i++){
int y = q.front().y;
int x = q.front().x;
int broke = q.front().broke;
q.pop();
if(y == n-1 && x == m-1) return depth;
for(int j = 0; j < 4; j++){
int ny = y+dy[j];
int nx = x+dx[j];
if(0 <= ny && ny < n && 0 <= nx && nx < m){
if(maze[ny][nx] == 1){
if(broke >= k) continue;
if(visited[ny][nx][broke+1]) continue;
visited[ny][nx][broke+1] = 1;
q.push(node(ny, nx, broke+1));
}
else{
if(visited[ny][nx][broke]) continue;
visited[ny][nx][broke] = 1;
q.push(node(ny, nx, broke));
}
}
}
}
}
return -1;
}
int main(){
cin >> n >> m >> k;
maze.resize(n, vector<int>(m));
for(int y = 0; y < n; y++)
for(int x = 0; x < m; x++)
scanf("%1d", &maze[y][x]);
printf("%d\n", bfs());
return 0;
}
벽 부수고 이동하기 문제에서 벽을 부술 수 있는 개수 k 가 추가되었다. 방문 배열의 3차원 축을 k+1 (부순 벽의 개수 + 부수지 않았을 때) 로 하여 bfs 를 진행하면 된다.
'Baekjoon' 카테고리의 다른 글
Baekjoon 3108번 로고 (0) | 2020.11.02 |
---|---|
Baekjoon 1194번 달이 차오른다, 가자. (0) | 2020.11.02 |
Baekjoon 6087번 레이저 통신 (0) | 2020.10.31 |
Baekjoon 2151번 거울 설치 (0) | 2020.10.30 |
Baekjoon 3197번 백조의 호수 (0) | 2020.10.29 |
댓글