สมมติว่าเรามีเมทริกซ์ 2 มิติที่มีค่าต่างกันเล็กน้อยดังนี้ -
-
0 สำหรับเซลล์ว่าง
-
1 สำหรับคน
-
2 สำหรับไฟ
-
3 สำหรับผนัง
ตอนนี้สมมติว่ามีเพียงคนเดียวและในแต่ละเทิร์นไฟจะขยายออกไปทั้งสี่ทิศทาง (ขึ้น ลง ซ้ายและขวา) แต่ไฟไม่สามารถขยายผ่านกำแพงได้ เราต้องตรวจสอบว่าบุคคลนั้นสามารถย้ายไปที่มุมบนซ้ายหรือมุมล่างขวาหรือเมทริกซ์ เราต้องจำไว้ว่าในแต่ละเทิร์น บุคคลจะเคลื่อนที่ก่อน จากนั้นไฟจะขยายตัว หากบุคคลนั้นไปถึงเซลล์เป้าหมายในช่วงเวลาเดียวกับไฟ แสดงว่าเขาปลอดภัย ดังนั้นหากบุคคลไปที่ห้องขังแล้วไฟลุกลามไปยังห้องเดียวกัน บุคคลนั้นก็จะยังรอดอยู่
ดังนั้นหากอินพุตเป็นแบบ
| 0 | 0 | 0 |
| 0 | 0 | 1 |
| 0 | 0 | 2 |
จากนั้นผลลัพธ์จะเป็น True เนื่องจากบุคคลนั้นสามารถไปที่มุมซ้ายบนได้
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
R :=จำนวนแถวของ A, C :=จำนวนคอลัมน์ของ A
-
กำหนดฟังก์ชัน bfs() นี่จะใช้เวลาคิว
-
dist :=แผนที่ที่มีคีย์เป็นโหนดของคิวและค่าทั้งหมดเป็น 0
-
ขณะที่คิวไม่ว่างให้ทำ
-
node :=รายการซ้ายของคิว จากนั้นลบรายการที่เหลือ
-
สำหรับโหนดเพื่อนบ้านแต่ละโหนดให้ทำ
-
ถ้าเนยไม่อยู่ไกลกัน
-
dist[nei] :=dist[โหนด] + 1
-
ใส่ nei ท้ายคิว
-
-
-
-
กลับ dist
-
จากวิธีหลัก ให้ทำดังต่อไปนี้ −
-
fire_que :=คิวที่สิ้นสุดสองครั้ง
-
person_que :=คิวที่สิ้นสุดสองครั้ง
-
สำหรับแต่ละแถวดัชนี r และแถว A ทำ
-
สำหรับแต่ละคอลัมน์ดัชนี c และค่า v ในแถว ทำ
-
ถ้า v เท่ากับ 1 แล้ว
-
ใส่คู่ (r, c) ที่ส่วนท้ายของ person_que
-
-
มิฉะนั้นเมื่อ v เท่ากับ 2 แล้ว
-
ใส่คู่ (r, c) ที่จุดสิ้นสุดของ fire_que
-
dist_fire :=bfs(fire_que)
-
-
-
-
dist_person :=bfs(person_que)
-
สำหรับแต่ละสถานที่ใน (0, 0), (R − 1, C -1) ทำ
-
if (dist_fire[place] ถ้าไม่มีอยู่ INF)>=(dist_person[place] หากไม่มีอยู่ 2 * INF) ดังนั้น
-
คืนค่า True
-
-
-
คืนค่าเท็จ
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
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