몽셀통통의 블로그
[BaekJoon] 14502 연구소 :: monton 본문
문제
https://www.acmicpc.net/problem/145023
풀이
dfs로 풀었는데 bfs도 가능할것 같다
dfs로 3개의 벽을 차례로 놓은 후 바이러스 퍼지는 것을 dfs로 다시 구현하여 남은 0이 몇개인지 구하면 된다
코드
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #include <iostream> using namespace std; int N, M,ans; int arr[9][9]; int visit[9][9]; int visit2[9][9]; int dir[4][2] = { {-1,0},{0,1},{1,0},{0,-1} }; void dfs(int x, int y) { if (x < 0 || x >= N || y < 0 || y >= M) return; if (visit2[x][y]||arr[x][y]==1) return; visit2[x][y] = 1; for (int i = 0; i < 4; i++) { dfs(x + dir[i][0], y + dir[i][1]); } } void init() { for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { visit2[i][j] = 0; } } } void func(int x, int y,int cnt) { if (cnt == 3) { for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (arr[i][j] == 2&&!visit2[i][j]) dfs(i,j); } } int num = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (!arr[i][j]&&!visit2[i][j]) num++; } } init(); ans = ans > num ? ans : num; return; } for (int i = x; i < N; i++) { for (int j = 0; j < M; j++) { if (!arr[i][j]&&!visit[i][j]) { visit[i][j] =arr[i][j]= 1; func(i, j, cnt + 1); visit[i][j] = arr[i][j] = 0; } } } } int main() { cin >> N >> M; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { cin >> arr[i][j]; } } func(0, 0, 0); cout << ans; } | cs |
'프로그래밍 > 백준 문제 풀기' 카테고리의 다른 글
[BaekJoon] 1600 말이 되고픈 원숭이 :: monton (0) | 2018.06.03 |
---|---|
[BaekJoon] 1938 통나무옮기기 :: monton (0) | 2018.06.03 |
[BaekJoon] 10026 적록색약 :: monton (0) | 2018.05.31 |
[BaekJoon] 2066 미로만들기 :: monton (0) | 2018.05.31 |
[BaekJoon] 3055 탈출 :: monton (0) | 2018.05.30 |