문제: icpc.me/14502
N,M의 범위가 매우 적기 때문에 나올 수 있는 경우를 전부 확인해줄 수 있다.
6중 포문을 통하여 모든 경우에 벽을 세워본 후 dfs를 통하여 바이러스가 얼마나 퍼질 수 있는지 조사하여 그 최솟값을 전체 크기에서 벽을 제외한 값에서 빼주면 된다.
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 | #include <cstdio> #include <algorithm> #include <cstring> using namespace std; int n, m, a[9][9], r, visited[9][9], b; int dx[] = { 0,0,1,-1 }; int dy[] = { 1,-1,0,0 }; bool chk(int x, int y) { return 0 <= x&&x < n && 0 <= y&&y < m; } int dfs(int x, int y) { visited[x][y] = 1; int ret = 1; for (int i = 0; i < 4; i++) { int cx = x + dx[i]; int cy = y + dy[i]; if (chk(cx, cy) && !visited[cx][cy] && !a[cx][cy]) ret += dfs(cx, cy); } return ret; } int getmax(int ix,int iy,int jx,int jy,int kx,int ky) { a[ix][iy] = 1, a[jx][jy] = 1, a[kx][ky] = 1; memset(visited, 0, sizeof(visited)); int ret = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) if (a[i][j] == 2 && !visited[i][j]) ret += dfs(i, j); } a[ix][iy] = 0, a[jx][jy] = 0, a[kx][ky] = 0; return ret; } int main() { scanf("%d%d", &n, &m); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf("%d", &a[i][j]); if (a[i][j] == 1)b++; } } r = 987654321; for (int ix = 0; ix < n; ix++) { for (int iy = 0; iy < m; iy++) { for (int jx = 0; jx < n; jx++) { for (int jy = 0; jy < m; jy++) { for (int kx = 0; kx < n; kx++) { for (int ky = 0; ky < m; ky++) { if (a[ix][iy] || a[jx][jy] || a[kx][ky]) continue; r = min(r, getmax(ix, iy, jx, jy, kx, ky)); } } } } } } printf("%d\n", n*m - 3 - b - r); return 0; } | cs |
'알고리즘 관련 > BOJ' 카테고리의 다른 글
BOJ)14500 테트로미노 (4) | 2017.04.17 |
---|---|
BOJ)14501 퇴사 (0) | 2017.04.17 |
BOJ)3079 입국심사 (1) | 2017.04.13 |
BOJ)2820 자동차 공장 (0) | 2017.04.13 |
BOJ)7573 고기잡이 (0) | 2017.04.12 |