PS (C, C++)
[백준/C++] 14923 미로 탈출
최연재
2024. 10. 3. 00:57
https://www.acmicpc.net/problem/14923
코드
#include <iostream>
#include <queue>
#include <climits>
using namespace std;
#define MAX 1001
#define FASTIO ios::sync_with_stdio(false);cin.tie(NULL);
typedef pair<int, int> pi;
int n, m, arr[MAX][MAX], hx, hy, ex, ey, ans = INT_MAX;
int dx[4] = { 1, -1, 0, 0 }, dy[4] = { 0, 0, 1, -1 };
bool visit[MAX][MAX][2];
void bfs() {
queue<pair<pi, pi>> q;
q.push({ {hx, hy}, {0, 0} });
visit[hx][hy][0] = true;
while (!q.empty()) {
int x = q.front().first.first;
int y = q.front().first.second;
int cnt = q.front().second.first;
int use = q.front().second.second;
q.pop();
if (x == ex && y == ey) {
ans = min(ans, cnt);
continue;
}
for (int i = 0; i < 4; i++) {
int gx = x + dx[i];
int gy = y + dy[i];
if (gx >= 0 && gx < n && gy >= 0 && gy < m && !visit[gx][gy][use]) {
if (arr[gx][gy] == 0 ) {
q.push({ {gx, gy} , {cnt + 1, use} });
visit[gx][gy][use] = true;
}
if (arr[gx][gy] == 1 && use == 0) {
q.push({ {gx, gy}, {cnt + 1, 1} });
visit[gx][gy][1] = true;
}
}
}
}
}
int main() {
FASTIO;
cin >> n >> m;
cin >> hx >> hy;
cin >> ex >> ey;
hx--; hy--; ex--; ey--;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> arr[i][j];
}
}
bfs();
if (ans == INT_MAX) cout << -1;
else cout << ans;
return 0;
}
설명
미로 정보를 입력받고, 홍익이의 현재 위치에서부터 bfs를 돌리면 된다. 큐에는 현재 좌표정보, 현재까지 이동한 거리, 지팡이 사용 횟수를 저장해주었다. 지팡이를 사용하지 않았다면 벽을 한 번 부술 수 있으므로 for 문 내에서 if문으로 경우를 나눠 처리했다.
느낀 점
지팡이 사용 횟수를 저장해주기 위해 3차원으로 방문 배열을 관리하면 된다! 입력되는 좌표가 1부터 시작하기 때문에 전부 1씩 감소시켜주고 시작했다.