반응형
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
typedef pair<int, int> point;
int N, M;
int lab[50][50];
int day[50][50];
bool isUsed[10];
int answer = 987654321;
int zero_count;
vector <point> virus;
point dir[4] = { {0,1}, {0,-1}, {1,0}, {-1,0} };
void cpyLab(int v_lab[50][50])
{
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
v_lab[i][j] = lab[i][j];
}
void bfs()
{
int virus_lab[50][50];
cpyLab(virus_lab);
memset(day, -1, sizeof(day));
int isHealthy = zero_count;
int total_day = 0;
queue <point> que;
for (int i = 0; i < virus.size(); i++)
{
if (isUsed[i]) {
que.push(virus[i]);
day[virus[i].first][virus[i].second] = 0;
}
else virus_lab[virus[i].first][virus[i].second] = 3;
}
while (!que.empty())
{
auto front = que.front();
int rr = front.first;
int cc = front.second;
que.pop();
for (int i = 0; i < 4; i++)
{
int tr = rr + dir[i].first;
int tc = cc + dir[i].second;
if (tr < 0 || tr >= N)
continue;
if (tc < 0 || tc >= N)
continue;
if (virus_lab[tr][tc] == 0 || virus_lab[tr][tc] == 3)
{
day[tr][tc] = day[rr][cc] + 1;
if(virus_lab[tr][tc] == 0)
{
isHealthy--;
total_day = day[tr][tc];
}
virus_lab[tr][tc] = 2;
que.push({ tr, tc });
}
}
}
if(isHealthy == 0)
answer = (answer > total_day) ? total_day : answer;
}
void solve(int n, int count) {
if (count == M)
{
bfs();
return; // 모든 바이러스를 선택했을 때
}
for (int i = n; i < virus.size(); i++)
{
if (!isUsed[i]) {
isUsed[i] = true;
solve(i + 1, count + 1);
isUsed[i] = false;
}
}
}
int main(int argc, char* argv[])
{
cin >> N >> M;
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
{
cin >> lab[i][j];
if (lab[i][j] == 2)
virus.push_back({ i, j });
else if(lab[i][j] == 0) zero_count++;
}
if(zero_count == 0)
cout << 0;
else {
solve(0, 0);
if (answer == 987654321)
cout << -1;
else
cout << answer;
}
}
77%에서 시간초과가 계속 떠서 day수 세는 법을 변경했었다.
기본 논리는 연구소 1이랑 유사하고, 카운트를 세는 방식에 대한 시간복잡도를 줄이는 게 관건이었던 것 같다.
반응형
'Algorithm' 카테고리의 다른 글
X-code 특정 파일 배제하고 빌드하기 (2) | 2020.02.10 |
---|---|
[백준 17472] 다리만들기 2 (0) | 2020.02.10 |
[백준 17281] ⚾ (0) | 2020.01.27 |
[백준 1780] 종이의 개수 (0) | 2020.01.26 |
[백준 1756] 피자 굽기 (0) | 2020.01.19 |
댓글