728x90
BFS를 사용해서 문제를 풀었습니다.
visit배열에 벽을 부순 횟수를 저장하며 탐색하며,
벽을 부순 횟수가 더 적게 방문하면 그 값으로 변환됩니다.
그리고 더 크면 접근하지 못하므로,
재방문도 막으며, 더 최적일 때만 접근이 가능하게 됩니다.
#include <iostream>
#include <cstring>
#include <string>
#include <queue>
#include <algorithm>
#define MAX 987654321
using namespace std;
bool flag = false;
int n, m, k;
int countNum = MAX;
int map[1010][1010];
int visit[1010][1010];
int moveX[4] = { 0, 1, 0, -1 };
int moveY[4] = { 1, 0, -1, 0 };
queue<vector<int> >q;
void BFS()
{
int a, b, c, d;
int x, y;
vector<int> v;
v.push_back(1);
v.push_back(1);
v.push_back(1);
v.push_back(0);
q.push(v);
while (!q.empty()) {
a = q.front()[0];
b = q.front()[1];
c = q.front()[2];
d = q.front()[3];
q.pop();
for (int i = 0; i < 4; ++i) {
x = moveX[i] + a;
y = moveY[i] + b;
if (x == n && y == m) {
while (!q.empty()) {
q.pop();
}
++c;
countNum = min(countNum, c);
return;
}
if (abs(map[x][y]) != 1 && d < visit[x][y] && d < k + 1) {
visit[x][y] = d;
vector<int> element;
element.push_back(x);
element.push_back(y);
element.push_back(c + 1);
element.push_back(d);
q.push(element);
}
if (map[x][y] == 1 && d < visit[x][y] && d < k) {
vector<int> element;
element.push_back(x);
element.push_back(y);
element.push_back(c + 1);
element.push_back(d + 1);
visit[x][y] = d + 1;
q.push(element);
}
}
}
return;
}
int main(int argc, char* argv[])
{
string s;
cin >> n >> m >> k;
memset(map, -1, sizeof(map));
memset(visit, 30, sizeof(map));
if (n == 1 && m == 1) {
cout << "1" << endl;
return 0;
}
for (int i = 1; i <= n; ++i) {
cin >> s;
for (int j = 1; j <= m; ++j) {
map[i][j] = s[j - 1] - '0';
}
}
BFS();
if (countNum == MAX) {
cout << "-1" << endl;
}
else {
cout << countNum << endl;
}
return 0;
}
'알고리즘' 카테고리의 다른 글
[C++] 백준 6087번 레이저 통신 (0) | 2019.11.11 |
---|---|
[C++] 백준 6593번 상범 빌딩 (0) | 2019.11.11 |
[C++] 백준 1600번 말이 되고픈 원숭이 (0) | 2019.11.11 |
[C++] 백준 4179번 불! (0) | 2019.11.10 |
[C++] 백준 1035번 조각 움직이기 (0) | 2019.11.08 |