비트마스트 bfs. 외판원순회처럼dfs로 해보려다가 중대한 문제점을 발견했다.
내가 dfs return값, 메모이제이션 설계를 잘 못한다는 것이었다.. 특히 분기가 많아질수록..
다음번엔 그거 보완해야겠다.
큰 깨달음을 얻은 문제.
from collections import deque
import sys
input = sys.stdin.readline
dx = [1, -1, 0, 0]
dy = [0, 0, -1, 1]
def bfs():
while q:
x, y, key, cnt = q.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < n and 0 <= ny < m and s[nx][ny] != "#" and not visit[nx][ny][key]:
if s[nx][ny] == ".":
visit[nx][ny][key] = 1
q.append([nx, ny, key, cnt + 1])
elif s[nx][ny] == "1":
return cnt + 1
else:
if s[nx][ny].isupper():
if key & 1 << (ord(s[nx][ny]) - 65):
visit[nx][ny][key] = 1
q.append([nx, ny, key, cnt + 1])
elif s[nx][ny].islower():
nc = key | (1 << ord(s[nx][ny]) - 97)
if visit[nx][ny][nc] == 0:
visit[nx][ny][nc] = 1
q.append([nx, ny, nc, cnt + 1])
return -1
n, m = map(int, input().split())
q = deque()
visit = [[[0] * 64 for i in range(m)] for i in range(n)]
s = list(list(input().rstrip()) for _ in range(n))
for i in range(n):
for j in range(m):
if s[i][j] == "0":
q.append([i, j, 0, 0])
s[i][j] = "."
visit[i][j][0] = 1
print(bfs())
'practivceAlgorithm > 백준' 카테고리의 다른 글
[백준][Python] 5624 좋은수 (0) | 2021.08.03 |
---|---|
[백준][Python] 17845 수강과목 (0) | 2021.08.02 |
[백준][Python] 1158요세푸스문제 (0) | 2021.07.31 |
[백준][Python] 20002 사과나무 (0) | 2021.07.31 |
[백준][Python] 1766 문제집 (0) | 2021.07.31 |