문제 URL : https://www.acmicpc.net/problem/18405
18405번: 경쟁적 전염
첫째 줄에 자연수 N, K가 공백을 기준으로 구분되어 주어진다. (1 ≤ N ≤ 200, 1 ≤ K ≤ 1,000) 둘째 줄부터 N개의 줄에 걸쳐서 시험관의 정보가 주어진다. 각 행은 N개의 원소로 구성되며, 해당 위치
www.acmicpc.net
문제접근법 : 난이도가 쉬운 bfs 문제입니다.
보드판 사이즈가 200밖에 되질않고
시간은 s가 10000이나 주어집니다.
최악의경우 바이러스 하나만있다고 가정하고 (1,1)에서 심어져서 (200,200) 까지
퍼진다해도 대충계산해도 200+200 즉 400초를 넘을수가없죠
따라서 bfs를 계속 돌지않도록 더이상 퍼지지않으면 bfs를 탈출하도록 하게 만들었구
굳이 1부터~ k번까지의 바이러스가 퍼져야하기때문에 굳이 전 queue에 담아 사용하지도 않았구
vector를 통해서 담아서 사용했습니다.
board 자체가 visit을 처리할수있기때문에 visit또한 절약할수있구요
소스코드 :
#include <bits/stdc++.h>
using namespace std;
int board[300][300];
int n, k;
int fy, fx, s;
int dy[4] = {-1, 0, 1, 0};
int dx[4] = {0, 1, 0, -1};
vector<pair<int, int>> v[1001];
void input()
{
cin >> n >> k;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> board[i][j];
if (board[i][j])
v[board[i][j]].push_back({i, j});
}
}
cin >> s >> fy >> fx;
}
bool isrange(int y, int x)
{
return 0 <= y && y < n && 0 <= x && x < n;
}
void print(int cnt)
{
cout << cnt << " : \n";
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cout << board[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
void solve()
{
int cnt = 0;
while (cnt < s)
{
int flag = 1;
for (int i = 1; i <= k; i++)
{
int size = v[i].size();
for (int k = 0; k < size; k++)
{
for (int j = 0; j < 4; j++)
{
int ny = v[i][k].first + dy[j];
int nx = v[i][k].second + dx[j];
if (isrange(ny, nx) && board[ny][nx] == 0)
{
flag = false;
board[ny][nx] = i;
v[i].push_back({ny, nx});
}
}
}
}
//print(cnt);
if (flag)
break;
cnt++;
}
//print(cnt);
cout << board[fy - 1][fx - 1] << "\n";
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
//freopen("input.txt", "r", stdin);
input();
solve();
}
궁금한점 혹은 모르는점 어떤 질문이든 댓글은 언제나 환영입니다.
'백준' 카테고리의 다른 글
백준 13544 수열과 쿼리 3 (1) | 2023.10.15 |
---|---|
백준 13905 세부 (0) | 2023.06.15 |
백준 16404 주식회사 승범이네 (0) | 2023.01.18 |
백준 2610 회의준비 (0) | 2023.01.18 |
백준 2617 구슬 찾기 (0) | 2023.01.18 |