아래와 같이 서로 다른 값이 거의 없는 2D 행렬이 있다고 가정합니다. -
-
빈 셀의 경우 0
-
1인용
-
2 불
-
벽에 3개
이제 사람이 한 명뿐이고 각 턴에 불이 네 방향(위, 아래, 왼쪽, 오른쪽)으로 확장되지만 벽을 통해 확장할 수 없다고 가정합니다. 사람이 왼쪽 위 모서리나 오른쪽 아래 모서리 또는 행렬로 이동할 수 있는지 확인해야 합니다. 우리는 매 턴마다 사람이 먼저 움직이고 그 다음에 불이 확장된다는 것을 명심해야 합니다. 사람이 화재와 같은 시간에 목표 세포 중 하나에 도달하면 안전합니다. 따라서 사람이 감방에 갔다가 불이 같은 방으로 번져도 그 사람은 여전히 살아남습니다.
따라서 입력이 다음과 같으면
0 | 0 | 0 |
0 | 0 | 1 |
0 | 0 | 2 |
사람이 왼쪽 상단으로 이동할 수 있으므로 출력은 True가 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
R :=A의 행 개수, C :=A의 열 개수
-
bfs() 함수를 정의합니다. 대기열이 필요합니다.
-
dist :=큐의 노드로 키를 포함하고 모든 값이 0인 맵
-
대기열이 비어 있지 않은 동안 수행
-
node :=큐의 왼쪽 항목, 그 다음 왼쪽 항목 삭제
-
노드의 각 이웃 nei에 대해 수행
-
nei가 dist에 없으면
-
dist[nei] :=dist[노드] + 1
-
대기열 끝에 nei 삽입
-
-
-
-
반환 거리
-
주요 방법에서 다음을 수행하십시오 -
-
fire_que :=이중 종료 대기열
-
person_que :=이중 종료 대기열
-
각 행 인덱스 r 및 행 A에 대해 수행
-
행의 각 열 인덱스 c 및 값 v에 대해 수행
-
v가 1과 같으면
-
person_que의 끝에 쌍(r, c) 삽입
-
-
그렇지 않으면 v가 2와 같을 때
-
fire_que의 끝에 쌍(r, c) 삽입
-
dist_fire :=bfs(fire_que)
-
-
-
-
dist_person :=bfs(person_que)
-
(0, 0), (R − 1, C − 1)의 각 자리에 대해 수행
-
if (dist_fire[place] if not exist then INF)>=(dist_person[place] if not exist then, 2 * INF), then
-
참을 반환
-
-
-
거짓을 반환
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
from collections import deque class Solution: def solve(self, A): INF = int(1e9) R, C = len(A), len(A[0]) def get_nei(r, c): for nr, nc in [[r − 1, c], [r, c − 1], [r + 1, c], [r, c + 1]]: if 0 <= nr < R and 0 <= nc < C and A[nr][nc] != 3: yield nr, nc def bfs(queue): dist = {node: 0 for node in queue} while queue: node = queue.popleft() for nei in get_nei(*node): if nei not in dist: dist[nei] = dist[node] + 1 queue.append(nei) return dist fire_que = deque() person_que = deque() for r, row in enumerate(A): for c, v in enumerate(row): if v == 1: person_que.append((r, c)) elif v == 2: fire_que.append((r, c)) dist_fire = bfs(fire_que) dist_person = bfs(person_que) for place in ((0, 0), (R− 1, C− 1)): if dist_fire.get(place, INF) >= dist_person.get(place, 2 * INF): return True return False ob = Solution() matrix = [ [0, 0, 0], [0, 0, 1], [0, 0, 2] ] print(ob.solve(matrix))
입력
[ [0, 0, 0], [0, 0, 1], [0, 0, 2] ]
출력
True