반응형
https://www.acmicpc.net/problem/14442
14442번: 벽 부수고 이동하기 2
첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000), K(1 ≤ K ≤ 10)이 주어진다. 다음 N개의 줄에 M개의 숫자로 맵이 주어진다. (1, 1)과 (N, M)은 항상 0이라고 가정하자.
www.acmicpc.net
BFS를 수행할 때 벽을 몇개 부쉈는지 체크해주어야 합니다.
방문을 체크하는 배열에도 벽을 부순 갯수를 추가해서
ch [x좌표][y좌표][벽을 부순 개수]
현재 좌표에서 몇개의 벽을 부쉈는지 저장해주어야합니다.
그리고 BFS를 수행하면 쉽게 구할 수 있습니다.
#include <bits/stdc++.h>
using namespace std;
int n, m, k;
bool arr[1003][1003];
bool ch[1003][1003][11];
struct Node {
int x, y, z,d;
};
int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,1,0,-1 };
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> k;
for (int i = 1; i <= n; i++) {
string s;
cin >> s;
for (int j = 1; j <= m; j++) {
arr[i][j] = s[j-1] - '0';
}
}
queue<Node> Q;
ch[1][1][0] = 1;
Q.push({ 1,1,0 ,1 });
bool flag = false;
while (!Q.empty()) {
int x = Q.front().x;
int y = Q.front().y;
int z = Q.front().z;
int d = Q.front().d;
Q.pop();
if (x == n && y == m) {
flag = true;
cout << d << '\n';
return 0;
}
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 (arr[nx][ny] == 1) {
if (z < k && ch[nx][ny][z + 1] == 0) {
ch[nx][ny][z + 1] = 1;
Q.push({ nx,ny,z + 1,d+1 });
}
}
else {
if (ch[nx][ny][z] == 0) {
ch[nx][ny][z] = 1;
Q.push({ nx,ny,z,d + 1 });
}
}
}
}
if (!flag) {
cout << -1 << '\n';
}
return 0;
}
반응형
'Algorithm > problem' 카테고리의 다른 글
백준 21276번 : 계보 복원가 호석 - 위상정렬 C++ 코드 (0) | 2022.02.25 |
---|---|
백준 2529번: 부등호 - 백트래킹, 위상정렬 풀이 C++ (0) | 2022.02.25 |
백준 3665번 : 최종 순위 - 위상정렬 C++ 문제풀이 및 코드 (0) | 2022.02.24 |
백준 2637번 : 장난감 조립 - 위상정렬 dp C++ (0) | 2022.02.24 |
백준 9470번 : Strahler 순서 - 위상정렬 C++ 코드 (0) | 2022.02.24 |