본문 바로가기

알고리즘/BOJ

[Python]1194-달이 차오른다, 가자.

https://www.acmicpc.net/problem/1194

1194번: 달이 차오른다, 가자.

첫째 줄에 미로의 세로 크기 N과 가로 크기 M이 주어진다. (1 ≤ N, M ≤ 50) 둘째 줄부터 N개의 줄에 미로의 모양이 주어진다. 같은 타입의 열쇠가 여러 개 있을 수 있고, 문도 마찬가지이다. 그리고,

www.acmicpc.net

요즘 그래프관련 문제가 재밌어서 풀고 있다. 그래프 관련이기도 하고, 제목이 간지나서 풀게 됐다.

내가 처음으로 풀어본 골드1 문제다.

 

처음엔 비트마스크를 할 생각을 못하고, visited[x][y]마다 set을 생성해서 가지고 있는 키를 정렬해서 키 in set이런 방식으로 구현하려는 어마무시한 생각을 했다..

비트마스크를 처음 써봤는데, 재밌다.

 

from collections import deque

n,m = map(int, input().split())
map_ = []
visited = []
for j in range(n):
    tmp = input()
    tmp2 = []
    tmp3 = []
    for i in range(m):
        if tmp[i] == '0':
            start = (j,i)
            tmp3.append('.')
        else:
            tmp3.append(tmp[i])
        tmp2.append([False]*64)
    visited.append(tmp2)
    map_.append(tmp3)

queue = deque()
queue.append((start[0], start[1], 0))
flag = True
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
cnt = 0
checkKey = [32, 16, 8, 4, 2, 1]
while flag:
    if len(queue) == 0:
        print(-1)
        break
    for _ in range(len(queue)):
        x,y, key = queue.popleft()
        for i in range(4):
            tmpX = x + dx[i]
            tmpY = y + dy[i]
            if 0 <= tmpX <= n-1 and 0 <= tmpY <= m-1 and not visited[tmpX][tmpY][key]:
                visited[tmpX][tmpY][key] = True
                if map_[tmpX][tmpY] == '.':
                    queue.append((tmpX, tmpY, key))

                elif 97 <= ord(map_[tmpX][tmpY]) <= 102:
                    queue.append((tmpX, tmpY, key|checkKey[ord(map_[tmpX][tmpY])-97]))

                elif 65 <= ord(map_[tmpX][tmpY]) <= 70:
                    if key&checkKey[ord(map_[tmpX][tmpY])-65]:
                        queue.append((tmpX, tmpY, key))

                elif map_[tmpX][tmpY] == '1':
                    flag = False
                    break
    cnt += 1
if not flag:
    print(cnt)

 

 

'알고리즘 > BOJ' 카테고리의 다른 글

[Python]4181-Convex Hull  (0) 2020.09.12
[C++]11930-Smallest Enclosing Sphere  (0) 2020.09.12
[Python]2389-세상의 중심에서...  (0) 2020.09.12
[Python]16489-삼각형 해커  (0) 2020.09.10
[Python&C++]7868-해밍 수열  (0) 2020.07.11
[Python&C++]1037-약수  (0) 2020.05.19
[Python&C++]1026-보물  (0) 2020.05.18
[Python&C++]1032-명령 프롬포트  (0) 2020.05.18