https://www.acmicpc.net/problem/15683
15683번: 감시
스타트링크의 사무실은 1×1크기의 정사각형으로 나누어져 있는 N×M 크기의 직사각형으로 나타낼 수 있다. 사무실에는 총 K개의 CCTV가 설치되어져 있는데, CCTV는 5가지 종류가 있다. 각 CCTV가 감
www.acmicpc.net
브루트포스를 이용한 문제.
1번 - 상하좌우
2번 - 상하
3번 - 상하좌우
4번 - 상하좌우
5번 - 한가지 경우
이렇게 번호별로 경우의 수를 나눠 그대로 짜면 된다.
기능구현을 마쳤으면 모든 경우의수를 테스트 해보면 된다.
파이썬에서 재귀함수를 사용할 때 리스트를 인자로 넘겨주고 그 리스트에 변화가 없게 하려면
from copy import deepcopy를 해주어 deepcopy를 사용해야 한다.
하지만 deepcopy는 시간이 오래 걸리기 때문에 다음에 deepcopy를 사용하지 않고 풀어봐야겠다.
import sys
answer = sys.maxsize
from copy import deepcopy
def watch(brr, q, v):
global answer
if v == len(q):
s = 0
for i in range(len(brr)):
for j in range(len(brr[0])):
if brr[i][j] == 0:
s += 1
if answer > s:
answer = s
return
y = queue[v][0]
x = queue[v][1]
dy = [0, 1, 0, -1]
dx = [1, 0, -1, 0]
if queue[v][2] == 1:
for i in range(4):
vec = i
arr = deepcopy(brr)
yy = y
xx = x
while 0 <= yy < n and 0 <= xx < m:
if arr[yy][xx] == 0:
arr[yy][xx] = -1
elif arr[yy][xx] == 6:
break
yy += dy[vec]
xx += dx[vec]
watch(arr, q, v+1)
elif queue[v][2] == 2:
for i in range(2):
vec = i
arr = deepcopy(brr)
for _ in range(2):
yy = y
xx = x
while 0 <= yy < n and 0 <= xx < m:
if arr[yy][xx] == 0:
arr[yy][xx] = -1
elif arr[yy][xx] == 6:
break
yy += dy[vec]
xx += dx[vec]
vec = (vec + 2) % 4
watch(arr, q, v+1)
elif queue[v][2] == 3:
for i in range(4):
vec = i
arr = deepcopy(brr)
for _ in range(2):
yy = y
xx = x
while 0 <= yy < n and 0 <= xx < m:
if arr[yy][xx] == 0:
arr[yy][xx] = -1
elif arr[yy][xx] == 6:
break
yy += dy[vec]
xx += dx[vec]
vec = (vec + 1) % 4
watch(arr, q, v+1)
elif queue[v][2] == 4:
for i in range(4):
vec = i
arr = deepcopy(brr)
for _ in range(3):
yy = y
xx = x
while 0 <= yy < n and 0 <= xx < m:
if arr[yy][xx] == 0:
arr[yy][xx] = -1
elif arr[yy][xx] == 6:
break
yy += dy[vec]
xx += dx[vec]
vec = (vec + 1) % 4
watch(arr, q, v+1)
elif queue[v][2] == 5:
vec = 1
arr = deepcopy(brr)
for _ in range(4):
yy = y
xx = x
while 0 <= yy < n and 0 <= xx < m:
if arr[yy][xx] == 0:
arr[yy][xx] = -1
elif arr[yy][xx] == 6:
break
yy += dy[vec]
xx += dx[vec]
vec = (vec + 1) % 4
watch(arr, q, v+1)
return arr, v+1
if __name__ == '__main__':
n, m = map(int,input().split())
arr = [list(map(int,input().split())) for _ in range(n)]
queue = []
for i in range(n):
for j in range(m):
if 0 < arr[i][j] < 6:
queue.append([i,j,arr[i][j]])
watch(arr, queue, 0)
print(answer)
'백준(BOJ)' 카테고리의 다른 글
[Java/자바] - 백준(BOJ) 16938번 : 캠프 준비 (0) | 2022.05.12 |
---|---|
[Python/파이썬] - 백준(BOJ) 13904번 : 과제 (0) | 2022.05.11 |
[Python/파이썬] - 백준(BOJ) 2644번 : 촌수계산 (0) | 2022.05.11 |
[Java/자바] - 백준(BOJ) 2636번 : 치즈 (0) | 2022.05.11 |
[Python/파이썬] - 백준(BOJ) 21735번 : 눈덩이 굴리기 (0) | 2022.05.08 |