Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมตรวจสอบการใช้เข็มทิศหลบ מבוךใน Python


สมมติว่าเราเล่นเกมที่ติดอยู่ใน מבוך เราต้องหาทางออก מבוךสามารถนำเสนอเป็นเมทริกซ์ขนาด 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