알고리즘 풀이/백준
13460번-구슬 탈출2
claire
2022. 4. 18. 09:47
#include<iostream>
#include<string>
#include<queue>
#include<tuple>
#define X first
#define Y second
using namespace std;
int n, m;
pair<int, int> red, blue; // 빨간 구슬과 파란 구슬의 위치
string board[11];
// dist[a][b][c][d] : 빨간 구슬이 (a, b)이고 파란 구슬이 (c, d)에 위치한 상황에 도달하기 위한 동작의 횟수
int dist[11][11][11][11];
int dx[4] = { 0, 1, 0, -1 };
int dy[4] = { 1, 0, -1, 0 };
int bfs() {
queue<tuple<int, int, int, int>> q;
q.push({ red.X, red.Y, blue.X, blue.Y });
dist[red.X][red.Y][blue.X][blue.Y] = 0;
while (!q.empty()) {
int rx, ry, bx, by;
tie(rx, ry, bx, by) = q.front();
q.pop();
int cnt = dist[rx][ry][bx][by];
// 10번 넘게 탈출 못하면 -1
if (cnt >= 10)
return -1;
for (int i = 0; i < 4; i++) {
int n_rx = rx, n_ry = ry, n_bx = bx, n_by = by;
while (board[n_bx + dx[i]][n_by + dy[i]] == '.') {
n_bx += dx[i];
n_by += dy[i];
}
// Blue가 탈출했다면 실패이므로 continue
if (board[n_bx + dx[i]][n_by + dy[i]] == 'O') continue;
while (board[n_rx + dx[i]][n_ry + dy[i]] == '.') {
n_rx += dx[i];
n_ry += dy[i];
}
// Red가 탈출했다면 종료, 바로 정답을 반환
if (board[n_rx + dx[i]][n_ry + dy[i]] == 'O') return cnt + 1;
if ((n_rx == n_bx) && (n_ry == n_by)) {
//아래
if (i == 0) {
ry < by ? n_ry-- : n_by--;
}
//오른쪽
else if (i == 1) {
rx < bx ? n_rx--: n_bx--;
}
//위
else if (i == 2) {
ry > by ? n_ry++ : n_by++;
}
//왼쪽
else if (i == 3) {
rx > bx ? n_rx++ : n_bx++;
}
}
if (dist[n_rx][n_ry][n_bx][n_by] != -1)continue;
dist[n_rx][n_ry][n_bx][n_by] = cnt + 1;
q.push({ n_rx,n_ry,n_bx,n_by });
}
}
return -1;
}
int main() {
cin >> n >> m;
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
for (int k = 0; k < 10; k++) {
fill(dist[i][j][k], dist[i][j][k] + 10, -1);
}
}
}
for (int i = 0; i < n; i++) {
cin >> board[i];
for (int j = 0; j < m; j++) {
if (board[i][j] == 'B') {
blue = { i, j };
board[i][j] = '.';
}
else if (board[i][j] == 'R') {
red = { i, j };
board[i][j] = '.';
}
}
}
cout << bfs();
}
제발 변수 실수 조심 좀.....