✏️ Algorithm/알고리즘 풀이

백준 15683번 감시 - C++

미미누 2022. 1. 22. 13:12

[문제]

https://www.acmicpc.net/problem/15683

 

15683번: 감시

스타트링크의 사무실은 1×1크기의 정사각형으로 나누어져 있는 N×M 크기의 직사각형으로 나타낼 수 있다. 사무실에는 총 K개의 CCTV가 설치되어져 있는데, CCTV는 5가지 종류가 있다. 각 CCTV가 감

www.acmicpc.net

 

[풀이]

백트래킹 + 시뮬레이션 / 4진법을 이용한 방향 탐색 문제

 

[코드]

#include <bits/stdc++.h>
using namespace std;

#define X first
#define Y second

int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};
int n,m;

int board1[10][10];
int board2[10][10];

vector<pair<int,int>> cctv;

bool OOB(int a, int b){
    return a < 0 || a>=n || b < 0 || b>=m;
    
}

void upd(int x, int y, int dir){
    dir %= 4;
    while(1)
    {
        x+= dx[dir];
        y+= dy[dir];
        if(OOB(x,y) || board2[x][y] == 6) return;
        if(board2[x][y] != 0) continue;
        board2[x][y] = 7;
    }
}

int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    cin >> n >> m;
    int nm=0;
    
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            cin >> board1[i][j];
            if(board1[i][j] != 0 && board1[i][j] != 6)
                cctv.push_back({i,j});
            if(board1[i][j] == 0) nm++;
        }
    }
    for(int tmp = 0; tmp < (1<<(2*cctv.size())); tmp++)
    {
        for(int i=0; i<n; i++)
            for(int j=0; j<m; j++)
                board2[i][j] = board1[i][j];
        int brute = tmp;
        for(int i=0; i< cctv.size(); i++){
            int dir = brute % 4;
            brute/=4;
            int x = cctv[i].X;
            int y = cctv[i].Y;
            if(board1[x][y] == 1){
                upd(x,y,dir);
            }
            else if(board1[x][y] == 2){
                upd(x,y,dir);
                upd(x,y,dir+2);
            }
            else if(board1[x][y] == 3){
                upd(x,y,dir);
                upd(x,y,dir+1);

            }
            else if(board1[x][y] == 4){
                upd(x,y,dir);
                upd(x,y,dir+1);
                upd(x,y,dir+2);
            }
            else{
                upd(x,y,dir);
                upd(x,y,dir+1);
                upd(x,y,dir+2);
                upd(x,y,dir+3);
            }
        }
        int val =0;
        for(int i=0; i<n; i++)
            for(int j=0; j<m; j++)
                val+= (board2[i][j] == 0);
        nm = min(nm, val);
        
    }
    cout << nm;
    
}