คำอธิบายปัญหา
กำหนดเมทริกซ์ไบนารี: 0 = ทางเดิน, 1 = กำแพง เริ่มที่ (0,0) หา **จำนวนเซลล์น้อยที่สุด** (รวมจุดเริ่มต้น) เพื่อไปถึง (R-1, C-1) หาไม่ได้คืน -1
ตัวอย่าง
Matrix: 0 0 0 1 0 0 0 1 1 0 0 0 0 1 1 1 1 0 0 0
Output: 8 (เส้นทาง: (0,0)→(1,0)→(2,0)→(2,1)→(2,2)→(3,2)→(3,3)→(3,4) = 8 เซลล์)
ขั้นตอนการแก้ปัญหา (BFS)
- คิว
qเริ่มต้น[(0,0,1)]หาก (0,0) เป็น 0 - ทำเครื่องหมาย
matrix[0][0] = 1(visited) - BFS: pop (r,c,d) ถ้าถึงปลายทาง คืน
d - ตรวจสอบ 4 ทิศทาง: ในขอบเขต และเป็น 0 → mark=1, push (nr,nc,d+1)
- จบลูปไม่เจอ → คืน -1
การตนการทำงาน (Python)
def solve(matrix):
R, C = len(matrix), len(matrix[0])
q = [(0, 0, 1)] if not matrix[0][0] else []
matrix[0][0] = 1
for r, c, d in q:
if (r, c) == (R - 1, C - 1):
return d
for x, y in [(r+1,c), (r-1,c), (r,c+1), (r,c-1)]:
if 0 <= x < R and 0 <= y < C and matrix[x][y] == 0:
matrix[x][y] = 1
q.append((x, y, d + 1))
return -1
matrix = [
[0, 0, 0, 1, 0],
[0, 0, 1, 1, 0],
[0, 0, 0, 1, 1],
[1, 1, 0, 0, 0]
]
print(solve(matrix)) # Output: 8
อินพุต / เอาต์พุต
Input: [[0,0,0,1,0],[0,0,1,1,0],[0,0,0,1,1],[1,1,0,0,0]] Output: 8