문제 링크


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

 

1697번: 숨바꼭질

문제 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가

www.acmicpc.net

 

접근 방법


어떤 지점에 도달하는데 있어 최초로 도달한 시간을 기록하는 문제이기에 BFS를 사용해야겠다고 떠올렸다.

 

(1) 변수

 visited[i]는 i에 도달하였을때의 시간을 기록해두며, 방문 여부도 동시에 판단할 수 있게 한다.

next[i]는 다음으로 이동할 지점이다.     

 

(2) 풀이

  다음 이동할 지점을 기록한 next[i] 가 도착지점(to)에 최초 도달할 때(visited[next[i]]가 -1인 상태) visited[now] + 1을

반환하면 된다.                                                                               

소스 코드


 

#include <iostream>
#include <queue>
#include <string.h>

using namespace std;

int visited[100001];

int bfs(int from, int to) {
	queue <int> q;
	q.push(from);
	visited[from] = 0;

	while (!q.empty()) {
		int now = q.front();
		int next[3] = { now + 1, now - 1, now * 2 };
		q.pop();
		for (int i = 0; i < 3; i++) 			
			if (0 <= next[i] && next[i] <= 100000 && visited[next[i]] == -1) {
				if (next[i] == to) return visited[now] + 1;
				q.push(next[i]);
				visited[next[i]] = visited[now] + 1;
			}
	}
	return 0;
}

int main() {
	int from, to;
    memset(visited, -1, sizeof(visited));
	cin >> from >> to;
	cout << bfs(from, to);
}

개발 환경 : VS 2019

질문, 지적 환영입니다.

'알고리즘 > 백준' 카테고리의 다른 글

[C++] 백준 14500 테트로미노  (0) 2020.05.20
[C++] 백준 2206 벽 부수고 이동하기  (0) 2020.05.19
[C++] 백준 14501 퇴사  (0) 2020.05.19
[C++] 백준 12865 평범한 배낭  (2) 2020.05.18
[C++] 백준 15686 치킨 배달  (0) 2020.05.18

+ Recent posts