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

 

이번에 볼 문제는 백준 18405번 문제인 경쟁적 전염이다.
문제는 아래 링크를 확인하자.

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

 

18405번: 경쟁적 전염

첫째 줄에 자연수 N, K가 공백을 기준으로 구분되어 주어진다. (1 ≤ N ≤ 200, 1 ≤ K ≤ 1,000) 둘째 줄부터 N개의 줄에 걸쳐서 시험관의 정보가 주어진다. 각 행은 N개의 원소로 구성되며, 해당 위치

www.acmicpc.net

바이러스가 전염되는 순서에 우선순위가 있으므로, 해당 우선순위에 맞춰 주어진 바이러스들을 정렬하고 그 순서대로 확산해나가는 것을 반복하자.

 

BFS를 이용하면 한 단계씩 바이러스를 확산시켜나가는 구현을 하기 편리하다.

이 때, BFS의 깊이를 조절해 S초까지만 바이러스를 확산시켜나가면 문제를 간단히 해결할 수 있다.

 

상하좌우 칸 탐색의 구현은 아래의 코드에서 dr배열과 dc배열을 만든 것과 같이 구현하는 것으로 편리하게 할 수 있다.

 

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

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

int N, K, S, X, Y;
int arr[202][202];
vector<pair<int, pair<int, int>>> vec;
int dr[4] = { 1,-1,0,0 };
int dc[4] = { 0,0,1,-1 };

void bfs() {
	sort(vec.begin(), vec.end());
	queue<pair<pair<int, int>, int>> que; // {{좌표},깊이}
	for (auto p : vec) {
		que.push(make_pair(p.second, 0));
	}

	while (!que.empty()) {
		int r = que.front().first.first, c = que.front().first.second, cnt = que.front().second;
		que.pop();
		if (cnt < S) {
			for (int i = 0; i < 4; i++) {
				int rr = r + dr[i], cc = c + dc[i];
				if (rr<1 || rr>N || cc<1 || cc>N || arr[rr][cc]) continue;
				arr[rr][cc] = arr[r][c];
				que.push(make_pair(make_pair(rr, cc), cnt + 1));
			}
		}
	}
}

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

	cin >> N >> K;
	for (int r = 1; r <= N; r++) {
		for (int c = 1; c <= N; c++) {
			int v; cin >> v;
			if (v) {
				arr[r][c] = v;
				vec.emplace_back(make_pair(v, make_pair(r, c)));
			}
		}
	}
	
	cin >> S >> X >> Y;

	bfs();

	cout << arr[X][Y];
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 15967 // C++] 에바쿰  (0) 2022.05.05
[BOJ 21213 // C++] Mentors  (0) 2022.05.04
[BOJ 24933 // C++] Quadratic Dissonance  (0) 2022.05.02
[BOJ 25001 // C++] Pen  (0) 2022.05.01
[BOJ 24999 // C++] Prom  (0) 2022.05.01

+ Recent posts