반응형
포인트
- 혼란한 문제입니다. 밑줄이 쳐져 있는 부분이 제일 중요한 포인트입니다. 최대한 많은 전원을 연결해야 하지만 그렇지 못할 경우를 고려해 줄 수 있어야 합니다.
🧶문서는 항상 수정될 수 있습니다. 비판은 환영합니다.
python
dx = [0, 1, -1, 0]
dy = [1, 0, 0, -1]
def cancel(row: int, col: int, dir: int, plus: int) -> None:
"""
# 시작점으로 부터 설치한 선 제거하기
:param row:
:param col:
:param dir:
:param plus:
"""
nx = row + dx[dir]
ny = col + dy[dir]
for _ in range(plus):
data[nx][ny] = 0
nx += dx[dir]
ny += dy[dir]
def install(row: int, col: int, d: int):
"""
주어진 방향으로 설치하기 만약 브레이크를 만나면 취소
:param row:
:param col:
:param d:
:return:
"""
nx, ny = row, col
dr, dc = dx[d], dy[d]
plus = 0
while 0 <= nx + dr < n and 0 <= ny + dc < n:
nx += dr
ny += dc
if data[nx][ny]:
break
data[nx][ny] = 1
plus += 1
else:
return plus
# 만약 브레이크 걸리면 취소
cancel(row, col, d, plus)
return 0
def go(index: int, length: int) -> None:
"""
방향을 지정하면 얻는 함수
:param index:
:param length:
"""
global maxCores, result
if maxCores < len(sel):
maxCores = len(sel)
result = 987654321
if maxCores == len(sel):
result = min(result, length)
for i in range(index, len(cores)):
for directions in range(4):
x, y = cores[i]
plus = install(x, y, directions)
if plus !=0:
sel.append(i)
go(i + 1, length + plus)
sel.pop()
cancel(x, y, directions, plus)
for test in range(1, int(input()) + 1):
n = int(input())
data = [list(map(int, input().split())) for _ in range(n)]
cores = []
for row in range(n):
for col in range(n):
if data[row][col]:
if row == 0 or row == n - 1 or col == 0 or col == n - 1:
continue
else:
cores.append((row, col))
maxCores = 0
result = 987654321
sel = []
go(0, 0)
print('#{} {}'.format(test, result))
반응형
'알고리즘' 카테고리의 다른 글
[알고리즘] 캐슬 디펜스 (0) | 2021.04.20 |
---|---|
[알고리즘] 마법사 상어와 파이어스톰 (0) | 2021.04.18 |
[알고리즘] 원판 돌리기 (0) | 2021.04.14 |
[알고리즘] Deepest Leaves Sum (0) | 2021.04.11 |
[알고리즘] 이차원 배열과 연산 (0) | 2021.04.10 |
댓글