백준 15683 감시 C++
[문제 링크]
https://www.acmicpc.net/problem/15683
[입출력 예]
입력 | 출력 |
---|---|
4 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 6 0 0 0 0 0 0 0 |
20 |
[소스코드]
#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; } // 위치와 방향을 주면, "그 다음 점부터" 비어있으면 7로 칠하고 벽에막히거나 나가면 종료 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; } } // 정보 입력 받아 board1에 저장 // mn을 전체 0의 개수로 초기화 // 총 경우의 수는 4방향 ^ 카메라 대수임. // 그 경우의 수에 대해 for문으로 돌려야 하고, 각 카메라 방향 4진법 변환하듯 얻을 수 있음. // i개의 방향과 i개의 cctv 위치가 주어졌으므로 for문을 통해 upd함수로 7로 칠함 (0이 사각지대) // 한 케이스 내에서 모든 cctv에 upd를 적용했을 때 남은 0의 개수와 현재 mn을 비교, 갱신 int main(void){ ios::sync_with_stdio(0); cin.tie(0); cin >> n >> m; int mn = 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) mn++; } } // 1 << (2*cctv.size())는 4의 cctv.size()승을 의미. for(int tmp = 0; tmp < (1<<(2*cctv.size())); tmp++){ // tmp를 4진법으로 뒀을 때 각 자리수를 cctv의 방향으로 생각할 것이다. 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; // tie(x, y) = cctv[i];로 쓰면 1줄로 줄일 수 있음 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{ // board1[x][y] == 5 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); mn = min(mn, val); } cout << mn; }
[ 출처 ]
https://github.com/encrypted-def/basic-algo-lecture/blob/master/0x0D/solutions/15683.cpp
'PS > BOJ' 카테고리의 다른 글
백준 2178 미로탐색 C++ (0) | 2022.02.10 |
---|---|
백준 3055번 탈출 파이썬 (0) | 2022.02.09 |
백준 9663 N-Queen (0) | 2022.02.09 |
백준 1780번 종이의 개수 풀이 (0) | 2022.02.09 |
백준 17478 재귀함수가 뭔가요? C++ (0) | 2022.02.08 |
댓글
이 글 공유하기
다른 글
-
백준 2178 미로탐색 C++
백준 2178 미로탐색 C++
2022.02.10[문제 링크] https://www.acmicpc.net/problem/2178 [입출력 예] 입력 출력 4 6 101111 101010 101011 111011 15 [소스코드] //20:35시작 #include using namespace std; #define X first #define Y second int board[100][100]; int v[100][100]; int n,m; int dx[4]= {1,0,-1,0}; int dy[4]= {0,1,0,-1}; void printBoard(){ for (int i=0; i -
백준 3055번 탈출 파이썬
백준 3055번 탈출 파이썬
2022.02.09 -
백준 9663 N-Queen
백준 9663 N-Queen
2022.02.09 -
백준 1780번 종이의 개수 풀이
백준 1780번 종이의 개수 풀이
2022.02.09[문제 링크] https://www.acmicpc.net/problem/1780 [입출력 예] 입력 출력 9 0 0 0 1 1 1 -1 -1 -1 0 0 0 1 1 1 -1 -1 -1 0 0 0 1 1 1 -1 -1 -1 1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 -1 0 1 -1 0 1 -1 0 -1 1 0 1 -1 0 1 -1 0 1 -1 1 0 -1 0 1 -1 10 12 11 [소스코드] #include #define endl '\n'; using namespace std; int arr[2187][2187]; int cnt[3]; //0번째 : -1 개수, 1번째: 0 개수 , 2번째: 1 개수 bool checkArr(int r1, …
댓글을 사용할 수 없습니다.