반응형
https://www.acmicpc.net/problem/15683
본 문제는 주어진 cctv를 회전하여 사각지대의 최솟값을 구하는 문제다. cctv는 총 5가지가 존재하여 회전은 4방향으로 가능하다. 따라서, cctv의 위치를 vector에 저장하고 cctv가 회전할 수 있는 모든 경우의 수를 확인하면 된다. 모든 경우의 수는 4방향으로 회전이 가능하기 때문에 4^(cctv 개수)의 경우의 수가 발생한다. 따라서 1 << ( 2*cctv.size() ) 만큼 탐색하면 된다. 마지막으로 cctv의 사각지대이면서 벽이 아닌곳의 개수를 구하면 된다.
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 73 74 75 76 77 78 79 80 81 82 83 | #include <cstdio> #include <vector> #include <cstring> using namespace std; int map[9][9]; bool chk[9][9]; // 위 오른쪽 아래 왼쪽 int dx[] = {-1, 0, 1, 0}; int dy[] = {0, 1, 0, -1}; vector<pair<int, int>> cctv; int n, m; void solution(int x, int y, int dir) { dir %= 4; while (true) { chk[x][y] = true; x += dx[dir]; y += dy[dir]; if (x < 0 || x >= n || y < 0 || y >= m) break; if (map[x][y] == 6) break; } } int main() { scanf("%d %d", &n, &m); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf("%d", &map[i][j]); if (map[i][j] != 0 && map[i][j] != 6) { cctv.push_back(make_pair(i, j)); } } } int ans = n*m; for (int tmp = 0; tmp < (1<<(2*cctv.size())); tmp++) { int brute = tmp; memset(chk, false, sizeof(chk)); for (int i = 0; i < cctv.size(); i++) { int dir = brute % 4; brute /= 4; int x = cctv[i].first; int y = cctv[i].second; if (map[x][y] == 1) { solution(x, y, dir); } else if (map[x][y] == 2) { solution(x, y, dir); solution(x, y, dir+2); } else if (map[x][y] == 3) { solution(x, y, dir); solution(x, y, dir+1); } else if (map[x][y] == 4) { solution(x, y, dir); solution(x, y, dir+1); solution(x, y, dir+3); } else if (map[x][y] == 5) { solution(x, y, dir); solution(x, y, dir+1); solution(x, y, dir+2); solution(x, y, dir+3); } } int cnt = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (!chk[i][j] && map[i][j] != 6) cnt += 1; } } if (ans > cnt) ans = cnt; } printf("%d\n", ans); } | cs |
반응형
'백준' 카테고리의 다른 글
[백준 17070] 파이프 옮기기 1, C++ (0) | 2020.04.22 |
---|---|
[백준 16933] 벽 부수고 이동하기 3, C++ (0) | 2020.04.22 |
[백준 15662] 톱니바퀴 (2), C++ (0) | 2020.04.12 |
[백준 1938] 통나무 옮기기, C++ (0) | 2020.03.30 |
[백준 1005] ACM Craft, C++ (0) | 2020.03.22 |
댓글