1697번: 숨바꼭질
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
BFS를 이용해서 풀었는데 자꾸 틀렸습니다가 뜸
시작점(N)에 다시 방문하지 않게 하기 위해 visited[N]을 1로 넣고 시작했더니 [1 1] 같은 케이스에서 0이 아닌 2가 출력된 것이었음.
bfs 앞부분에 같으면 0 출력하고 종료하는 코드를 넣으니까 풀렸다.
visited랑 몇번째 방문인지 체크하는 배열을 따로 선언해야 하나 고민중
사실 visited가 0이 아니면 무조건 방문한 거니까 거기에 몇번째 방문인지 체크하는게 메모리 효율은 좋을텐데, 고려해야 할 사항이 늘어나서 번거롭기도 하다.
#include<iostream>
#include<queue>
using namespace std;
int n, k;
int visited[200001];
void bfs() {
if (n == k) {
cout << 0 << endl;
return;
}
queue<int> q;
q.push(n);
visited[n] = 1;
while (!q.empty()) {
int cur = q.front();
q.pop();
if ((cur + 1) == k || (cur - 1) == k || (cur * 2) == k) {
cout << visited[cur] << endl;
return;
}
if ((cur + 1) <200000 && visited[cur + 1] == 0) {
q.push(cur + 1);
visited[cur + 1] = visited[cur] + 1;
}
if ((cur + 1) >= 0 && visited[cur - 1] == 0) {
q.push(cur - 1);
visited[cur - 1] = visited[cur] + 1;
}
if ((cur * 2) < 200000 && visited[cur * 2] == 0) {
q.push(cur * 2);
visited[cur * 2] = visited[cur] + 1;
}
}
}
int main() {
cin >> n >> k;
bfs();
return 0;
}
'에러 잡기 > 문제 풀이' 카테고리의 다른 글
백준 13913 숨바꼭질4 (0) | 2021.04.09 |
---|---|
백준 12851 숨바꼭질 2 (0) | 2021.04.03 |
백준 16953 A->B (0) | 2021.03.30 |
백준 7562 나이트의 이동 (0) | 2021.03.26 |
백준 1012 유기농 배추 (0) | 2021.03.24 |
댓글