티스토리 뷰
https://www.acmicpc.net/problem/14502
1. input 값을 받으며 2의 개수 및 좌표와 0의 개수를 저장한다.
2. dfs로 전체를 돌며 0인 곳에 3개씩 1로 만든다.
3. 3개를 만들고 나면 2의 좌표를 돌며 바이러스를 퍼트리면서 안전영역을 구한다.
4. dfs가 끝나면 result에 안전영역 최댓값이 들어있으므로 출력한다.
#include <iostream>
#include <algorithm>
#include <memory.h>
using namespace std;
int N, M, cnt0, cnt2, tmp, result;
int map[8][8];
int v[64][2];
bool visited[8][8];
bool calvisited[8][8];
int dir[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
void cal(int i, int j)
{
calvisited[i][j] = true;
for (int d = 0; d < 4; d++)
{
int nexti = i + dir[d][0]; int nextj = j + dir[d][1];
if (nexti >= 0 && nextj >= 0 && nexti < N && nextj < M
&& !calvisited[nexti][nextj] && map[nexti][nextj] ==0)
{
tmp--;
cal(nexti, nextj);
}
}
}
void dfs(int t)
{
if (t == 0)
{
tmp = cnt0-3;
memset(calvisited, false, sizeof(calvisited));
for (int i = 0; i < cnt2; i++)
{
cal(v[i][0], v[i][1]);
}
result = max(result, tmp);
return;
}
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
if (map[i][j] == 0 && !visited[i][j])
{
map[i][j] = 1; visited[i][j] = true;
dfs(t-1);
map[i][j] = 0; visited[i][j] = false;
}
}
}
}
int main()
{
cin >> N >> M; cnt0 = 0; cnt2 = 0; result = 0;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
cin >> map[i][j];
if (map[i][j] == 2)
{
v[cnt2][0] = i; v[cnt2][1] = j;
cnt2++;
}
else if (map[i][j] == 0)
{
cnt0++;
}
}
}
dfs(3);
cout << result << endl;
return 0;
}
'알고리즘 > BOJ' 카테고리의 다른 글
[BOJ 14888] 연산자 끼워넣기 (0) | 2018.07.15 |
---|---|
[BOJ 14889] 스타트와 링크 (0) | 2018.07.15 |
[BOJ 9205] 맥주 마시면서 걸어가기 (0) | 2018.07.15 |
[BOJ 2583] 영역 구하기 (0) | 2018.07.14 |
[BOJ 2573] 빙산 (0) | 2018.07.08 |
- Total
- Today
- Yesterday
- DFS
- 17140
- 알고리즘
- 입출력
- DP
- 새로운 게임 2
- 팁
- hackerrank
- 미세먼지 안녕!
- 시간 복잡도
- 트렌드
- SWEA
- 17142
- boj
- scanf
- 2018 KAKAO BLIND RECRUITMENT
- 연구소 3
- 삼성
- 17143
- 17779
- 17837
- 2018 카카오 블라인드 채용
- STL
- SW Expert Academy
- 백준
- 17144
- 역량 테스트
- 이차원 배열과 연산
- 게리맨더링 2
- string
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |