สมมติว่าเราเล่นเกมที่ติดอยู่ใน מבוך เราต้องหาทางออก מבוךสามารถนำเสนอเป็นเมทริกซ์ขนาด n x m โดย n คือจำนวนแถว และ m คือจำนวนคอลัมน์ แต่ละเซลล์มีสัญลักษณ์ 'O', 'D', 'S', หรือ '-' โดย 'O' หมายถึงทาง bị חסום, 'D' คือทางออก, 'S' คือตำแหน่งเริ่มต้น, และ '-' หมายถึงเดินผ่านได้ เราสามารถเคลื่อนที่ผ่านเซลล์ '-' ได้อย่างอิสระ เรายังมีเข็มทิศเพื่อหาทิศทางของทางออก ('D') แต่ใช้ได้สูงสุด k ครั้ง กำหนดเมทริกซ์ מבוךและจำนวนครั้งที่ใช้เข็มทิศ ให้หาว่าสามารถหลบหนีได้ภายใน k ครั้งหรือไม่ หากเป็นไปได้คืนค่า True มิฉะนั้น False
ตัวอย่างอินพุต
grid = เมทริกซ์ 4x11 ตามที่แสดง, n = 4, m = 11, k = 3 → ผลลัพธ์ True
ขั้นตอนการแก้ปัญหา
นิยามฟังก์ชัน
path_search()รับพารามิเตอร์ curr_pos, grid, total_rows, total_cols, k, predecessorนิยามฟังก์ชัน
succesor_positions()หาตำแหน่งถัดไปที่เป็นไปได้ (ซ้าย, ขวา, บน, ล่าง) ที่ไม่ใช่ 'O' และไม่ใช่ตำแหน่งก่อนหน้าค้นหาตำแหน่งเริ่มต้น 'S' ใน grid
เรียก
path_search()พร้อมพารามิเตอร์เริ่มต้น
โค้ดต้นฉบับ (Python)
def path_search(curr_pos, grid, total_rows, total_cols, k, predecessor):
x, y = curr_pos
if grid[x][y] == "D":
if k == 0:
print('True')
else:
print('False')
else:
parent = predecessor[curr_pos]
succ_pos = list(succesor_positions(curr_pos, grid, total_rows, total_cols, parent))
use_compass = len(succ_pos) > 1
for position in succ_pos:
predecessor[position] = curr_pos
if use_compass:
path_search(position, grid, total_rows, total_cols, k - 1, predecessor)
else:
path_search(position, grid, total_rows, total_cols, k, predecessor)
def succesor_positions(curr_pos, grid, total_rows, total_cols, pred):
x, y = curr_pos
succ_pos = []
if y > 0:
left = (x, y - 1)
succ_pos.append(left)
if y < total_cols - 1:
right = (x, y + 1)
succ_pos.append(right)
if x > 0:
up = (x - 1, y)
succ_pos.append(up)
if x < total_rows - 1:
down = (x + 1, y)
succ_pos.append(down)
return filter(lambda pos: grid[pos[0]][pos[1]] != "O" and pos != pred, succ_pos)
def solve(grid, n, m, k):
curr_pos = ()
for i, row in enumerate(grid):
for j, element in enumerate(row):
if element == 'S':
curr_pos = (i, j)
path_search(curr_pos, grid, n, m, k, predecessor={curr_pos: None})
grid = [['-', 'O', '-', 'O', '-', '-', '-', '-', '-', '-', 'O'],
['-', 'O', 'D', '-', 'O', '-', 'O', 'O', 'O', '-', 'O'],
['-', 'O', 'O', '-', 'O', '-', 'O', 'S', '-', '-', '-'],
['-', '-', '-', '-', '-', '-', 'O', 'O', 'O', 'O', '-']]
solve(grid, 4, 11, 3)
อินพุต
grid = [['-', 'O', '-', 'O', '-', '-', '-', '-', '-', '-', 'O'], ['-', 'O', 'D', '-', 'O', '-', 'O', 'O', 'O', '-', 'O'], ['-', 'O', 'O', '-', 'O', '-', 'O', 'S', '-', '-', '-'], ['-', '-', '-', '-', '-', '-', 'O', 'O', 'O', 'O', '-']], 4, 11, 3
เอาต์พุต
True