-
[백준][C++] 19952. 인성 문제 있어?Algorithm/BAEKJOON 2020. 10. 9. 16:25
제목 어그로에 이끌려서 풀게 된 문제...
전형적인 BFS 문제인데 문제 조건을 잘못 이해해서 좀 헤맸다ㅠ
힘이랑 장애물 위치, 높이 정보가 주어지면 힘이 0이 될 때까지 목적지에 도달할 수 있는지 여부를 출력하는 문제이다.
한번 이동할 때마다 힘이 1씩 감소하고,
현재 위치보다 이동할 위치의 높이가 높으면 남아있는 힘이 (이동할 위치의 높이 - 현재 위치의 높이)보다 크거나 같아야만 이동할 수 있다.
난 이 조건을 잘못 이해해서 높이 차만큼 힘도 같이 감소되도록 코드를 작성해서 틀렸다.
해당 조건은 그냥 제약사항일 뿐 힘의 감소에는 영향을 미치지 않는다는 것을 주의하자.
아무튼 조건에 맞게 힘을 감소시켜주고 bfs를 돌면서,
목적지에 도착하면 true,
bfs를 끝까지 돌았음에도 목적지에 도달하지 못하면 false를 반환해주면 된다.
// 19952_인성문제있어.cpp #define _CRT_SECURE_NO_WARNINGS using namespace std; #include <iostream> #include <cstring> #include <queue> #include <utility> #define MAX 101 int T; // test case int maze[MAX][MAX]; int visited[MAX][MAX]; int direction[4][2] = { {1, 0}, {0, 1}, {-1, 0}, {0, -1} }; bool bfs(int h, int w, int f, int xs, int ys, int xe, int ye) { bool result = false; queue<pair<int, pair<int, int>>> q; q.push(make_pair(f, make_pair(xs, ys))); visited[xs][ys] = 1; while (!q.empty()) { int force = q.front().first; int x = q.front().second.first; int y = q.front().second.second; q.pop(); if (x == xe && y == ye) { // 도착하면 true result = true; break; } if (force == 0) continue; for (int i = 0; i < 4; i++) { int nx = x + direction[i][0]; int ny = y + direction[i][1]; if (nx > h || ny > w || nx < 1 || ny < 1) continue; if (visited[nx][ny]) continue; if (force >= (maze[nx][ny] - maze[x][y])) { visited[nx][ny] = 1; q.push(make_pair(force - 1, make_pair(nx, ny))); } } } return result; } int main() { scanf("%d", &T); for (int tc = 0; tc < T; tc++) { int h, w, o, f, xs, ys, xe, ye; scanf("%d %d %d %d %d %d %d %d", &h, &w, &o, &f, &xs, &ys, &xe, &ye); memset(visited, 0, sizeof(visited)); memset(maze, 0, sizeof(maze)); for (int i = 0; i < o; i++) { // 장애물 정보 입력 int x, y, l; scanf("%d %d %d", &x, &y, &l); // x: 행, y: 열 maze[x][y] = l; } if (bfs(h, w, f, xs, ys, xe, ye)) printf("잘했어!!\n"); else printf("인성 문제있어??\n"); } return 0; }
'Algorithm > BAEKJOON' 카테고리의 다른 글
[백준][C++] 16637. 괄호 추가하기 (0) 2020.10.09 [백준][C++] 17070. 파이프 옮기기 1 (0) 2020.10.09 [백준][C++] 10282. 해킹 (0) 2020.09.25 [백준][C++] 14501. 퇴사 (0) 2020.09.19 [백준][C++] 11501. 주식 (0) 2020.09.09