https://www.acmicpc.net/problem/1194
요즘 그래프관련 문제가 재밌어서 풀고 있다. 그래프 관련이기도 하고, 제목이 간지나서 풀게 됐다.
내가 처음으로 풀어본 골드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 |