시나브로

15683. 감시 본문

알고리즘/백준

15683. 감시

혬혬 2020. 10. 15. 21:07
728x90
#include <iostream>
#include <vector>
#include <queue>
using namespace std;

typedef struct node {
    int i;
    int j;
};
vector<vector<int>> list = { {0,0,0,0},{0,1,0,0},{0,1,0,1},{1,1,0,0}, {1,1,0,1},{1,1,1,1} };
int dx[] = {-1,0,1,0 };
int dy[] = {0,1,0,-1 };
int N, M;
int max_check;
vector<int> shift(vector<int> i) {
    vector<int> k;

    k.push_back(i[3]);
    k.push_back(i[0]);
    k.push_back(i[1]);
    k.push_back(i[2]);

    return k;
}
void dfs(vector<vector<int>> map, int check, queue<node> qu) {
    if (qu.empty()) {
        if (max_check < check)
            max_check = check;
        return;
    }
    node value = qu.front();
    qu.pop();
    int k = map[value.i][value.j];
    vector<int> key = list[k];
    int n = value.i;
    int m = value.j;
    for (int i = 0; i < 4; i++) {
        int check1 = check;
        vector<vector<int>> map1 = map;
        for (int j = 0; j < 4; j++) {
            if (key[j] == 1) {
                n = value.i;
                m = value.j;
                while (1) {
                    n += dx[j];
                    m += dy[j];
                    if (n >= 0 && n < N && m >= 0 && m < M) {
                        if (map1[n][m] == 6)
                            break;
                        if (map1[n][m] == 0) {
                            check1++;
                            map1[n][m] = 7;
                        }
                    }
                    else
                        break;
                }
            }
        }
        dfs(map1, check1, qu);
        key = shift(key);
    }
}

int main() {

    freopen("inp.inp", "r", stdin);
    freopen("out.out", "w", stdout);
 
    cin >> N >> M;
    vector<vector<int>> map;
    int check = 0;
    queue<node> qu;
    for (int i = 0; i < N; i++) {
        vector<int> a;
        map.push_back(a);
        for (int j = 0; j < M; j++) {
            int k;
            cin >> k;
            if (k == 0)
                check++;
            if (k != 0 && k != 6)
                qu.push({ i,j });
            map[i].push_back(k);
        }
    }
    dfs(map, 0, qu);
    cout << check - max_check;


   
    return 0;
}


 

www.acmicpc.net/problem/15683

 

15683번: 감시

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

www.acmicpc.net

 

 

728x90

'알고리즘 > 백준' 카테고리의 다른 글

17142. 연구소3  (0) 2020.10.17
19238. 스타트 택시  (0) 2020.10.17
14890. 경사로  (0) 2020.10.15
3190. 뱀  (0) 2020.10.14
14891. 톱니바퀴  (0) 2020.10.14
Comments