본문 바로가기
개인 공부/코딩테스트

[C++][백준 1697][BFS DFS] 숨바꼭질 :: seoftware

by seowit 2020. 2. 29.

문제

https://www.acmicpc.net/problem/1697

 

1697번: 숨바꼭질

문제 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다. 수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지

www.acmicpc.net

소스코드

#include <queue>
#include <iostream>
using namespace std;
int x, y; //x는 수빈, y는 동생 좌표
int trace[100001];
queue<int> q;
int bfs() {
	q.push(x);
	trace[x] = 1;
	while (!q.empty()) {
		int p = q.front();
		q.pop();
		if (p == y) return trace[p] -1 ;

		if (p - 1 >= 0 && trace[p - 1] == 0) {
			q.push(p - 1);
			trace[p - 1] = trace[p] + 1;
		}
		if (p + 1 <= 100000 && trace[p + 1] == 0) {
			q.push(p + 1);
			trace[p + 1] = trace[p] + 1;
		}
		if (p * 2 <= 100000 && trace[2*p] == 0) {
			q.push(p * 2);
			trace[p * 2] = trace[p] + 1;
		}
	}
}
int main(void) {
	cin >> x >> y;
	
	cout << bfs();

	return 0;
}

숨바꼭질도 토마토 문제와 마찬가지고 이전 값을 이용하는 문제다!

댓글