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

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>

using namespace std;

int map[8][8];
int map2[8][8];
int N,M;
int result= 98787987;
int cctv=0;
vector <pair<int, int >> chkcctv;
vector <pair<int, int >> chking;
int dy[]={0,1,0,-1};
int dx[]={1,0,-1,0};
int chk[6][4]={
    {0,0,0,0},
    {1,0,0,0},
    {1,0,1,0},
    {1,0,0,1},
    {1,0,1,1},
    {1,1,1,1}
};



void moving(int y, int x){
    int ny = chkcctv[y].first;
    int nx = chkcctv[y].second;
    y=map[ny][nx];

    int n1=chk[y][0],n2=chk[y][1],n3=chk[y][2],n4=chk[y][3];

    for(int i=0;i<x;i++){
        int temp = n1;
        n1=n4;
        n4=n3;
        n3=n2;
        n2=temp;
    }
    int nny = ny;
    int nnx = nx;
    if(n1==1){
        for(int i=0;i<10;i++){
            nny = nny + dy[0];
            nnx = nnx + dx[0];
            if(nny<0||nnx<0||nny>=N||nnx>=M||map[nny][nnx]==6) break;
            map2[nny][nnx]=9;
        }
    }
    nny=ny;
    nnx=nx;
    if(n2==1){
        for(int i=0;i<10;i++){
            nny = nny + dy[1];
            nnx = nnx + dx[1];
            if(nny<0||nnx<0||nny>=N||nnx>=M||map[nny][nnx]==6) break;
            map2[nny][nnx]=9;
        }
    }
    nny=ny;
    nnx=nx;
    if(n3==1){
        for(int i=0;i<10;i++){
            nny = nny + dy[2];
            nnx = nnx + dx[2];
            if(nny<0||nnx<0||nny>=N||nnx>=M||map[nny][nnx]==6) break;
            map2[nny][nnx]=9;
        }
    }
    nny=ny;
    nnx=nx;
    if(n4==1){
        for(int i=0;i<10;i++){
            nny = nny + dy[3];
            nnx = nnx + dx[3];
            if(nny<0||nnx<0||nny>=N||nnx>=M||map[nny][nnx]==6) break;
            map2[nny][nnx]=9;
        }
    }

}


void simulation(int cnt){

    if(cnt>=cctv){
        memcpy( map2, map ,sizeof(map));

        for(int i=0;i<chking.size();i++){
            int ny= chking[i].first, nx= chking[i].second;
            moving(ny,nx);
        }
        int temp=0;
        for(int i=0;i<N;i++){
            for(int j=0;j<M;j++){
                if(map2[i][j]==0) temp++;
            }
        }
        if(temp<result) result = temp;
        return; 
    }

    for(int i=0;i<4;i++){
        chking.push_back({cnt,i});
        simulation(cnt+1);
        chking.erase(chking.end());
    }

}

int main(){

    freopen("input.txt","r",stdin);

    cin>>N>>M;
    for(int i=0;i<N;i++){
        for(int j=0;j<M;j++){
            cin>>map[i][j];
            if(map[i][j]>=1&&map[i][j]<=5){
                chkcctv.push_back({i,j});
                cctv++;
            }
        }
    }

    simulation(0);

    cout<<result;

    return 0;
}

+ Recent posts