반응형
포인트
1. bfs를 잘 할 수 있는가?
2. 조건을 이해할 수 있는가?
🧶문서는 항상 수정 될 수 있습니다. 비판은 환영합니다.
#include <iostream>
#include <queue>
#include <tuple>
using namespace std;
int n, m;
char map[11][11];
bool visited[11][11][11][11];
int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};
int rx, ry, bx, by;
int bfs() {
queue<tuple<int, int, int, int>> q;
q.emplace(rx, ry, bx, by);
visited[rx][ry][bx][by] = true;
int result = 0;
while (!q.empty()) {
int size = q.size();
while (size--) {
int xr, yr, xb, yb;
tie(xr, yr, xb, yb) = q.front();
q.pop();
if (map[xr][yr] == 'O' && map[xr][yr] != map[xb][yb]) {
// return result;
return 1;
}
for (int i = 0; i < 4; i++) {
int nxr = xr;
int nyr = yr;
int nxb = xb;
int nyb = yb;
while (map[nxr + dx[i]][nyr + dy[i]] != '#' && map[nxr][nyr] != 'O') {
nxr += dx[i];
nyr += dy[i];
}
while (map[nxb + dx[i]][nyb + dy[i]] != '#' && map[nxb][nyb] != 'O') {
nxb += dx[i];
nyb += dy[i];
}
if (nxr == nxb && nyr == nyb) {
if (map[nxr][nyb] == 'O') continue;
if (abs(nxr - xr) + abs(nyr - yr) <
abs(nxb - xb) + abs(nyb - yb)) {
nxb -= dx[i];
nyb -= dy[i];
} else {
nxr -= dx[i];
nyr -= dy[i];
}
}
if (!visited[nxr][nyr][nxb][nyb]) {
q.emplace(nxr, nyr, nxb, nyb);
visited[nxr][nyr][nxb][nyb] = true;
}
}
}
if (result == 10) return 0; //10이면 종료를 한다.
result += 1;
}
return 0;
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> map[i][j];
if (map[i][j] == 'R') {
rx = i;
ry = j;
} else if (map[i][j] == 'B') {
bx = i;
by = j;
}
}
}
cout << bfs();
return 0;
}
반응형
'알고리즘' 카테고리의 다른 글
[알고리즘] 괄호 추가하기 (0) | 2020.10.14 |
---|---|
[알고리즘] 배열 돌리기 4 (0) | 2020.10.14 |
[알고리즘] 구슬 탈출 시리즈 (구슬 탈출 2) (0) | 2020.10.09 |
[알고리즘] c++ cpp 구슬탈출 시리즈 (구슬탈출4) (0) | 2020.10.09 |
[알고리즘] c++ cpp 홈 방범 서비스 (0) | 2020.10.08 |
댓글