-
백준(BOJ) 15683번 감시알고리즘 풀이/백준(Boj) 2019. 9. 26. 19:28
문제 : https://www.acmicpc.net/problem/15683
15683번: 감시
스타트링크의 사무실은 1×1크기의 정사각형으로 나누어져 있는 N×M 크기의 직사각형으로 나타낼 수 있다. 사무실에는 총 K개의 CCTV가 설치되어져 있는데, CCTV는 5가지 종류가 있다. 각 CCTV가 감시할 수 있는 방법은 다음과 같다. 1번 CCTV는 한 쪽 방향만 감시할 수 있다. 2번과 3번은 두 방향을 감시할 수 있는데, 2번은 감시하는 방향이 서로 반대방향이어야 하고, 3번은 직각 방향이어야 한다. 4번은 세 방향, 5번은 네 방향을 감시할
www.acmicpc.net
풀이 : v배열에 1~5 cctv인 좌표 y,x들을 담는다. 그 후 재귀호출을 통해 0이 최소가 되는 best를 찾는다.
solve 함수는 해당 좌표에 90도씩 돌려주면서 재귀적으로 solve를 호출하고
rotate 함수는 그 i번 돌려( i는 한번에 90도 ) 주는 함수이다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters#include <iostream> #include <vector> #include <algorithm> using namespace std; int N, M; int room[9][9]; int visited[9][9]; vector<pair<int, int>> v; //상우하좌 const int dy[4] = { -1,0,1,0 }; const int dx[4] = { 0,1,0,-1 }; int best = 987654321; void check(int y, int x, int i, int num) { int ny = y ; int nx = x ; while (1) { ny += dy[i]; nx += dx[i]; if (room[ny][nx] == 6) break; if (!(ny >= 0 && ny < N && nx >= 0 && nx < M)) break; visited[ny][nx] += num; } } void rotate(int begin, int i, int num) { int y = v[begin].first; int x = v[begin].second; int number = room[y][x]; if (number == 1) { // 오른쪽 check(y, x, (i+1)%4, num); } else if (number == 2) { int y2 = y; int x2 = x; // 오른쪽 꺼 check(y, x, (i + 1)%4, num); // 왼쪽 꺼 check(y, x, (i + 3) % 4, num); } else if (number == 3) { // 오른쪽 꺼 check(y, x, (i + 1) % 4, num); // 위쪽꺼 꺼 check(y, x, (i + 0) % 4, num); } else if (number == 4) { // 오른쪽 꺼 check(y, x, (i + 1) % 4, num); // 위쪽꺼 꺼 check(y, x, (i + 0) % 4, num); //왼쪽꺼 check(y, x, (i + 3) % 4, num); } else if (number == 5) { // 오른쪽 꺼 check(y, x, (i + 1) % 4, num); // 위쪽꺼 꺼 check(y, x, (i + 0) % 4, num); //왼쪽꺼 check(y, x, (i + 3) % 4, num); // 아래꺼 check(y, x, (i + 2) % 4, num); } } void solve(int begin) { if (begin > v.size() - 1) { int cnt = 0; for (int i = 0; i < N; ++i) { for (int j = 0; j < M; ++j) { if (visited[i][j] == 0) cnt++; } } best = min(best, cnt); return; } for (int i = 0; i < 4; ++i) { rotate(begin, i, 1); solve(begin + 1); rotate(begin, i, -1); } } int main() { cin >> N >> M; for (int i = 0; i < N; ++i) { for (int j = 0; j < M; ++j) { cin >> room[i][j]; if (room[i][j] != 0 && room[i][j] != 6) { v.push_back({ i,j }); visited[i][j] = room[i][j]; } if (room[i][j] == 6) visited[i][j] = 6; } } // 담을 y,x 좌표가 없을때 if (v.size() == 0) { int cnt = 0; for (int i = 0; i < N; ++i) for (int j = 0; j < M; ++j) if (room[i][j] == 0) cnt++; cout << cnt << "\n"; return 0; } else { solve(0); cout << best << "\n"; } return 0; } '알고리즘 풀이 > 백준(Boj)' 카테고리의 다른 글
백준(BOJ) 12869번 뮤탈리스크 (31) 2019.09.28 백준(BOJ) 5014번 스타트링크 (31) 2019.09.27 백준(BOJ) 14238번 출근 기록 (31) 2019.09.25 백준(BOJ) 3184번 양 (31) 2019.09.24 백준(BOJ) 14502번 연구소 (0) 2019.09.23