250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 코테 대비
- 완전탐색
- MySQL
- 코테
- PyQt
- 코딩테스트
- the midnight library
- 쉬운 알고리즘 문제
- SQL
- swexpertacademy
- nightroutine
- sw expert
- 알고리즘 문제
- 삼성
- readingbook
- D4
- 원서
- 알고리즘
- English
- 원서읽기
- sw expert academy
- STUDYENGLISH
- 코테 준비
- dfs
- BFS
- 프로그래머스
- englishbook
- 백준
- 원서읽자
- 직무면접
Archives
- Today
- Total
시나브로
17142. 연구소3 본문
728x90
고려사항
1. 비활성화 세포가 활성화될 수 있다는 것을 인지하자 => 마지막에 비활성화세포가 활성세포가 되도, 큐에 넣지 않거나 시간 카운팅을 하면 안 되다.
2. 벽에 막혀서 세포번식이 안되는 경우를 생각하자.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
typedef struct m {
int i;
int j;
};
typedef struct q {
int i;
int j;
int t;
};
int maxs = 100000;
int N, M;
int map[55][55];
int emptys = 0;
int dx[] = { 0,1,0,-1 };
int dy[] = { -1,0,1,0 };
int simul(vector<m> list) {
int make_map[55][55] = { 0 };
queue<q> qu;
if (emptys == 0)
return 0;
for(int i=0;i<N;i++){
for (int j = 0; j < N; j++) {
make_map[i][j] = map[i][j];
}
}
for (int i = 0; i < list.size(); i++) {
qu.push({ list[i].i ,list[i].j,0});
make_map[list[i].i][list[i].j] = 5;
}
qu.push({ -1,-1,-1 });
int answer = 0;
int count = 0;
while (!qu.empty()) {
int i = qu.front().i;
int j = qu.front().j;
int t = qu.front().t;
qu.pop();
if (i == -1) {
if (qu.empty())
break;
answer++;
if (count == emptys)
break;
i = qu.front().i;
j = qu.front().j;
t = qu.front().t;
qu.pop();
qu.push({ -1,-1,-1 });
}
if (t > maxs)
return -1;
for (int k = 0; k < 4; k++) {
if (i + dx[k] < N && i + dx[k] >= 0 && j + dy[k] >= 0 && j + dy[k] < N) {
if (make_map[i + dx[k]][j + dy[k]] == 0) {
count++;
make_map[i + dx[k]][j + dy[k]] = t + +5;
qu.push({i + dx[k], j + dy[k], t + 1});
}
if (make_map[i + dx[k]][j + dy[k]] == 2) {
make_map[i + dx[k]][j + dy[k]] = t + 5;
qu.push({ i + dx[k], j + dy[k], t });
}
}
}
}
if (count != emptys)
answer = -1;
return answer;
}
void pick_point(vector<m> list, vector<m> v_list , int point) {
if (list.size() == M) {
int box=simul(list);
if (box == -1)
return;
if (maxs > box)
maxs = box;
return;
}
if (point >= v_list.size()) {
return;
}
pick_point(list, v_list, point + 1);
list.push_back(v_list[point]);
pick_point(list, v_list, point + 1);
}
int main() {
freopen("inp.inp", "r", stdin);
freopen("out.out", "w", stdout);
cin >> N >> M;
vector<m> list;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> map[i][j];
if (map[i][j] == 2) {
list.push_back({ i,j });
}
if (map[i][j] == 0) {
emptys++;
}
}
}
vector<m> li;
pick_point(li, list, 0);
if (maxs == 100000)
maxs = -1;
cout << maxs;
return 0;
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
2470. 두 용액 (0) | 2021.10.31 |
---|---|
17086. 아기 상어 2 (0) | 2021.10.31 |
19238. 스타트 택시 (0) | 2020.10.17 |
15683. 감시 (0) | 2020.10.15 |
14890. 경사로 (0) | 2020.10.15 |
Comments