สมมติว่าเรามีเมทริกซ์ 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