[백준 6087번 C/C++] 레이저 통신
[백준 6087번 C/C++] 레이저 통신

https://www.acmicpc.net/problem/6087
6087번: 레이저 통신
크기가 1×1인 정사각형으로 나누어진 W×H 크기의 지도가 있다. 지도의 각 칸은 빈 칸이거나 벽이며, 두 칸은 'C'로 표시되어 있는 칸이다. 'C'로 표시되어 있는 두 칸을 레이저로 통신하기 위해서
www.acmicpc.net
해결전략
너비우선탐색 BFS
정답코드
#include <iostream> #include <vector> #include <queue> using namespace std; int dirY[4] = { -1, 0, 1, 0 }; int dirX[4] = { 0, -1, 0, 1 }; int w, h; // w: 맵의 너비, h: 맵의 높이 int answer = 987654321; // 최소 거울 개수, 초기값은 매우 큰 값으로 설정 vector<vector<char>> v; // 맵 정보 vector<vector<vector<int>>> ch; // 각 위치에서의 거울 개수 및 방문 여부를 저장할 3차원 벡터 int startY, startX; // 시작 위치 struct Info{ int y, x, dir; }; int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); queue<Info> Q; cin >> w >> h; v.resize(h, vector<char>(w)); ch.resize(h, vector<vector<int>>(w, vector<int>(4, -1))); bool bStart = false; // 시작 위치가 설정되었는지 여부 for (int y = 0; y < h; y++){ for (int x = 0; x < w; x++) { cin >> v[y][x]; if (v[y][x] == 'C' && false == bStart) { // 시작 위치에서 4개 방향으로 탐색 시작 Q.push({ y, x, 0 }); // 북 Q.push({ y, x, 1 }); // 서 Q.push({ y, x, 2 }); // 남 Q.push({ y, x, 3 }); // 동 // 시작 위치에서의 거울 개수를 0으로 설정 ch[y][x][0] = 0; ch[y][x][1] = 0; ch[y][x][2] = 0; ch[y][x][3] = 0; startY = y; startX = x; bStart = true; } } } while(!Q.empty()) { int y = Q.front().y; int x = Q.front().x; int dir = Q.front().dir; Q.pop(); for(int i = 0; i < 4; i++){ int ny = y + dirY[i]; int nx = x + dirX[i]; int ndir = i; // 다음 방향 if (ny < 0 || h <= ny || nx < 0 || w <= nx || v[ny][nx] == '*') continue; // 범위 밖이거나 벽인 경우 if (ny == startY && nx == startX) continue; // 시작 위치는 지나가지 않음 if (v[ny][nx] == 'C'){ // 목표 위치('C') 도달 시 if (dir != ndir) // 방향을 튼 경우, 거울 개수 증가 answer = min(answer, ch[y][x][dir] + 1); else // 방향을 틀지 않은 경우 answer = min(answer, ch[y][x][dir]); continue; } // 아직 방문하지 않은 경우 || 더 적은 거울을 사용해 도달할 수 있는 경우 if (ch[ny][nx][ndir] == -1 || ch[ny][nx][ndir] > ch[y][x][dir] + (dir != ndir)) { Q.push({ ny, nx, ndir }); ch[ny][nx][ndir] = ch[y][x][dir] + (dir != ndir); // 방향 전환 시 거울 개수 증가 } } } cout << answer; return 0; }
'⭐ 코딩테스트 > 백준' 카테고리의 다른 글
[백준 7682번 C/C++] 틱택토 (1) | 2024.04.20 |
---|---|
[백준 15864번 C/C++] 사다리 조작 (1) | 2024.04.19 |
[백준 2589번 C/C++] 보물선 (0) | 2024.04.15 |
[백준 3687번 C/C++] 성냥개비 (0) | 2024.04.14 |
[백준 14890번 C/C++] 경사로 (0) | 2024.04.13 |
댓글
이 글 공유하기
다른 글
-
[백준 7682번 C/C++] 틱택토
[백준 7682번 C/C++] 틱택토
2024.04.20[백준 7682번 C/C++] 틱택토 https://www.acmicpc.net/problem/7682 7682번: 틱택토 틱택토 게임은 두 명의 사람이 번갈아가며 말을 놓는 게임이다. 게임판은 3×3 격자판이며, 처음에는 비어 있다. 두 사람은 각각 X 또는 O 말을 번갈아가며 놓는데, 반드시 첫 번째 사람이 X를 놓고 www.acmicpc.net 해결전략 구현 정답코드 #include #include using namespace std; vector v; bool isWin(int ny, int nx, char player) // 특정 플레이어가 이겼는지 확인하는 함수 { // 가로 틱택토 if (v[ny][nx] == player && v[ny][nx] == v[ny][nx + 1] && v[ny]… -
[백준 15864번 C/C++] 사다리 조작
[백준 15864번 C/C++] 사다리 조작
2024.04.19 -
[백준 2589번 C/C++] 보물선
[백준 2589번 C/C++] 보물선
2024.04.15[백준 2589번 C/C++] 보물선 https://www.acmicpc.net/problem/2589 2589번: 보물섬 보물섬 지도를 발견한 후크 선장은 보물을 찾아나섰다. 보물섬 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 각 칸은 육지(L)나 바다(W)로 표시되어 있다. 이 지도에서 www.acmicpc.net 해결전략 너비우선탐색 BFS 정답 코드 #include #include #include #include using namespace std; int dirY[4] = { -1, 0, 1, 0 }; int dirX[4] = { 0, -1, 0, 1 }; int r, c; vector v; int answer; void BFS(int startY, int startX… -
[백준 3687번 C/C++] 성냥개비
[백준 3687번 C/C++] 성냥개비
2024.04.14[백준 3687번 C/C++] 성냥개비 https://www.acmicpc.net/problem/3687 3687번: 성냥개비 각 테스트 케이스에 대해서 입력으로 주어진 성냥개비를 모두 사용해서 만들 수 있는 가장 작은 수와 가장 큰 수를 출력한다. 두 숫자는 모두 양수이어야 하고, 숫자는 0으로 시작할 수 없다. www.acmicpc.net 해결전략 구현 동적계획법 Dynamic Programming, DP 정답코드 #include #include #include using namespace std; int t; // 테스트 케이스의 개수 int n; // 성냥개비의 개수 // int num[10] = { 2, 5, 5, 4, 5, 6, 3, 7, 6, 6 }; // 각 숫자를 만드는데 필요한 성냥개비…
댓글을 사용할 수 없습니다.