#15683. 감시
Problem
Solution
- 설치된 CCTV 위치정보, 번호 얻기
- 설치된 CCTV 방향 정하기 (상하좌우: 0123)
1번 cctv: 0, 1, 2, 3
2번 cctv: (0, 1), (2, 3)
3번 cctv: (0, 3), (1, 3), (0, 2), (1, 2)
4번 cctv: (2, 0, 3), (0, 3, 1), (2, 1, 3), (0, 2, 1)
5번 cctv: (0, 1, 2, 3)
묶음을 왼쪽에서부터 0, 1, 2, 3이라고 정하고 (여기서 5번은 0만 갖게된다.)selected
배열에 넣어준다.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18void selectDirection(int idx, int cnt) {
if (cnt == cctv.size()) {
task(); // 방향대로 감시 시작
return;
}
int type = cctv[idx].type;
for (int i = 0; i < 4; ++i) {
if (type == 2) { // 2번 cctv는 최대 1 값만 가능
if (i == 2) break;
}
if(type == 5) { // 5번 cctv는 최대 0만 가능
if (i == 1) break;
}
selected[idx] = i;
selectDirection(idx + 1, cnt + 1);
selected[idx] = -1;
}
}- 선택된 방향대로 감시 시작
- 범위를 벗어나거나 벽을 만나면 감시를 중단한다. 그전까지는 정해진 방향대로 계속 check 표시를 한다.
- check는 check되어 있지 않고 맵의 값이 0인 경우에만 진행한다.
탐색된 곳의 개수를 구하기 위해서이다. 전체 칸의 개수 - 탐색된 곳의 개수 - 벽의 개수 - cctv 개수 = 사각지대 개수
- 사각지대가 최소가 되도록 갱신한다.
1 Try
1 |
|