반응형


정답 코드
#include <iostream> #include <utility> #include <queue> using namespace std; #define MAX_MAP 11 char map[MAX_MAP][MAX_MAP]; int dx[4] = { -1, 1, 0, 0 }; int dy[4] = { 0, 0, -1, 1 }; int N, M; pair<int, int> Red; pair<int, int> Blue; pair<int, int> Hole; struct MapInfo { pair<int, int> RedPos; pair<int, int> BluePos; int count; }; int Solve() { bool visited[MAX_MAP][MAX_MAP][MAX_MAP][MAX_MAP] = { false, }; //red와 blue의 각각 위치 queue<MapInfo> q; MapInfo m; m.BluePos = Blue; m.RedPos = Red; m.count = 0; q.push(m); visited[m.RedPos.first][m.RedPos.second][m.BluePos.first][m.BluePos.second] = true; while (!q.empty()) { MapInfo cur = q.front(); int ry = cur.RedPos.first; int rx = cur.RedPos.second; int by = cur.BluePos.first; int bx = cur.BluePos.second; q.pop(); if (cur.count > 10) return -1; if (ry == Hole.first && rx == Hole.second) { return cur.count; } //4방향으로 빈칸이 아닐때까지 이동 for (int i = 0; i < 4; i++) { int n_ry = ry + dy[i]; int n_rx = rx + dx[i]; int n_by = by + dy[i]; int n_bx = bx + dx[i]; while (1) { if (map[n_ry][n_rx] == '#') { n_ry -= dy[i]; n_rx -= dx[i]; break; } if (map[n_ry][n_rx] == 'O') break; n_ry += dy[i]; n_rx += dx[i]; } while (1) { if (map[n_by][n_bx] == '#') { n_by -= dy[i]; n_bx -= dx[i]; break; } if (map[n_by][n_bx] == 'O') break; n_by += dy[i]; n_bx += dx[i]; } //파란 구슬이 구멍에 빠졌으면 다른 방향으로 if (n_by == Hole.first && n_bx == Hole.second) continue; //같은 위치에 빨간색 구슬과 파란색 구슬이 있으면 위치를 조정해 줘야 함 //RB, BR 케이스 처리 //EX) RB인데 왼쪽이면 B가 한칸 오른쪽으로 가야함, BR인데 왼쪽이면 R이 한칸 오른쪽으로 가야함 if (n_ry == n_by && n_rx == n_bx) { switch(i) { case 0: rx > bx ? n_rx++ : n_bx++; break; case 1: rx < bx ? n_rx-- : n_bx--; break; case 2: ry > by ? n_ry++ : n_by++; break; case 3: ry < by ? n_ry-- : n_by--; break; } } if (visited[n_ry][n_rx][n_by][n_bx]) continue; MapInfo temp; temp.BluePos = make_pair(n_by, n_bx); temp.RedPos = make_pair(n_ry, n_rx); temp.count = cur.count + 1; q.push(temp); visited[n_ry][n_rx][n_by][n_bx] = true; } } return -1; } 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') { Red.first = i; Red.second = j; } else if (map[i][j] == 'B') { Blue.first = i; Blue.second = j; } else if (map[i][j] == 'O') { Hole.first = i; Hole.second = j; } } } cout << Solve() << endl; }
300x250
'알고리즘 > 삼성 SW 역량 테스트 기출 문제' 카테고리의 다른 글
[C++][BOJ] 삼성 SW 역량 테스트 기출 문제 - 13458번 시험 감독 (0) | 2021.05.17 |
---|---|
[C++][BOJ] 삼성 SW 역량 테스트 기출 문제 - 3190번 뱀 (0) | 2021.05.13 |
[C++][BOJ] 삼성 SW 역량 테스트 기출 문제 - 12100번 2048 (Easy) (0) | 2021.05.11 |
[C++][BOJ] 삼성 SW 역량 테스트 기출 문제 - 14889번 스타트와 링크 (0) | 2021.05.08 |
[C++][BOJ] 삼성 SW 역량 테스트 기출 문제 - 14888번 연산자 끼워넣기 (0) | 2021.05.03 |
댓글