반응형
리뷰
10달에 걸친 복수가 완료되었다. 아무것도 모르는 코린이 시절 날 괴롭혔던 문제
https://www.acmicpc.net/problem/17484
문제 풀이
- n과 m값을 받아오고 n * m크기의 맵을 초기화 해준다.
- 열의 개수 * 방향 배열의 개수 m * 3 만큼 for문을 개행시켜 주고, dfs의 매개변수로 열 인덱스와 방향 인덱스를 전달해 준다.
- 0, col 부터 탐색을 시작하여 이전과 같은 방향은 가지 못하도록 탐색을 시작해 준다.
- 현재 행이 n - 1에 도달한 경우 cv값을 ans와 비교해 최소값을 갱신해 준다.
- 모든 탐색이 종료된 후 ans에 저장된 값을 출력해 주면 된다.
참고 사항
가지치기로 nv값이 이미 ans보다 크다면 큐에 추가해 줄 필요가 없다.
정답 코드
#include<iostream>
#include<queue>
using namespace std;
int dx[] = { 1, 1, 1 };
int dy[] = { -1, 0, 1 };
int lst[6][6];
int n, m, ans = 1e9;
struct Pos {
int x, y, d, v;
};
void bfs(int col, int dir) {
queue<Pos> q;
q.push({ 0, col, dir, lst[0][col]});
while (!q.empty()) {
Pos pos = q.front(); q.pop();
int cx = pos.x, cy = pos.y, cd = pos.d, cv = pos.v;
if (cx == n - 1) {
ans = min(ans, cv);
continue;
}
for (int i = 0; i < 3; i++) {
if (cd == i) continue;
int nx = cx + dx[i], ny = cy + dy[i], nd = i;
if (0 <= ny && ny < m) {
int nv = cv + lst[nx][ny];
if (nv < ans) q.push({ nx, ny, nd, nv });
}
}
}
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> lst[i][j];
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < 3; j++) {
bfs(i, j);
}
}
cout << ans;
}
728x90
반응형
'알고리즘 공부 > C++' 카테고리의 다른 글
백준 17406번 배열 돌리기4 C++ 백트래킹, 구현, 시뮬레이션 (0) | 2024.09.03 |
---|---|
백준 17281번 ⚾ C++ 백트래킹, 구현, 시뮬레이션 (0) | 2024.09.03 |
백준 17471번 게리맨더링 C++ 백트래킹, DFS, BFS (1) | 2024.09.02 |
SWEA 1244번 [S/W 문제해결 응용] 2일차 - 최대 상금 C++ 그리디 알고리즘, 시뮬레이션 (0) | 2024.09.02 |
SWEA 10966번 물놀이를 가자 C++ BFS, Flood Fill, 너비 우선 탐색 (0) | 2024.09.02 |