※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 13700번 문제인 완전 범죄이다.
문제는 아래 링크를 확인하자.

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

 

13700번: 완전 범죄

첫째 줄에 N, S, D, F, B, K가 주어지고, K > 0인 경우에는 둘째 줄에 경찰서의 위치 l1, l2, …, lK가 주어진다. (1 ≤ S, D ≤ N ≤ 100000, 0 ≤ F, B ≤ 100000, 0 ≤ K ≤ N/2, S ≠ D ≠ l) 

www.acmicpc.net

문제의 주어진 상황은 각 건물 i를 노드로 생각하고, i번 노드에서 i+F번 노드로, i번 노드에서 i-B번 노드로 향하는 방향간선이 있는 방향그래프로 모델링할 수 있다. 단, i번째 건물이 경찰서인 경우 없는 노드 취급하고, 범위를 벗어난(i+F>N 또는 i-B<1) 노드로 이동하는 에지 또한 없는 에지 취급하자.

 

위 방향그래프의 S번 노드에서 D번 노드까지의 최단거리를 BFS를 이용해 구하는 것으로 문제를 해결할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <queue>
using namespace std;

int N, S, D, F, B, K;

int dist[100001];

void bfs() {
	dist[S] = 1;
	queue<int> que;
	que.push(S);
	while (!que.empty()) {
		int cur = que.front(); que.pop();
		if (cur + F <= N && dist[cur + F] == 0) {
			dist[cur + F] = dist[cur] + 1;
			que.push(cur + F);
		}
		if (cur - B > 0 && dist[cur - B] == 0) {
			dist[cur - B] = dist[cur] + 1;
			que.push(cur - B);
		}
	}
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N >> S >> D >> F >> B >> K;
	while (K--) {
		int x; cin >> x;
		dist[x] = -1;
	}

	bfs();

	if (dist[D] == 0) cout << "BUG FOUND";
	else cout << dist[D] - 1;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 26849 // C++] Non Classical Problem  (0) 2022.12.26
[BOJ 26770 // C++] Basen  (0) 2022.12.26
[BOJ 26005 // C++] 나뭇잎 학회  (0) 2022.12.26
[BOJ 26007 // C++] Codepowers  (0) 2022.12.26
[BOJ 26863 // C++] Absolutely Flat  (0) 2022.12.26

+ Recent posts