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

ตรวจสอบว่ากษัตริย์สามารถเดินได้หรือไม่เมื่อมี N ม้าบนกระดานหมากรุกที่ปรับเปลี่ยนใน Python

สมมติว่าเรามีกระดานหมากรุกอันสิ้นสุดที่มีกฎเหมือนหมากรุก และมีพิกัดของ N ม้าบนกระดานอันสิ้นสุดและพิกัดของกษัตริย์ เราต้องตรวจสอบว่ากษัตริย์ถูกเช็กเมทหรือไม่ พิกัดของกระดานอันสิ้นสุดถูกจำกัดด้วยค่ามาก เช่น (-10^9 <= x, y <= 10^9)

ตัวอย่าง

หากอินพุตคือตำแหน่งม้า = [[2,1],[1,3],[3,6],[5,5],[6,1],[7,3]] และตำแหน่งกษัตริย์: [4,3]

ตรวจสอบว่ากษัตริย์สามารถเดินได้หรือไม่เมื่อมี N ม้าบนกระดานหมากรุกที่ปรับเปลี่ยนใน Python

ผลลัพธ์จะเป็น True เนื่องจากกษัตริย์ไม่มีการเดินที่ถูกต้อง จึงเป็นเช็กเมท

ขั้นตอนการแก้ปัญหา

  1. my_dict := แมปใหม่
  2. ลูป i จาก 0 ถึง n:
    • x := a[i][0]
    • y := a[i][1]
    • ทำเครื่องหมายตำแหน่งม้าและตำแหน่งที่ม้าโจมตีได้ทั้ง 8 ทิศทางใน my_dict
  3. ลูป i จาก -1 ถึง 1:
    • ลูป j จาก -1 ถึง 1:
      • nx := king_pos[0] + i
      • ny := king_pos[1] + j
      • ถ้า i != 0 and j != 0:
        • ถ้า my_dict[(nx, ny)] เป็นศูนย์ ให้คืนค่า False
  4. คืนค่า True

การใช้งาน

def is_checkmate(a, n, king_pos):
    my_dict = {}
    for i in range(0, n):
        x = a[i][0]
        y = a[i][1]
        my_dict[(x, y)] = 1
        my_dict[(x - 2, y + 1)] = 1
        my_dict[(x - 2, y - 1)] = 1
        my_dict[(x + 1, y + 2)] = 1
        my_dict[(x + 1, y - 2)] = 1
        my_dict[(x - 1, y + 2)] = 1
        my_dict[(x + 2, y + 1)] = 1
        my_dict[(x + 2, y - 1)] = 1
        my_dict[(x - 1, y - 2)] = 1
    for i in range(-1, 2):
        for j in range(-1, 2):
            nx = king_pos[0] + i
            ny = king_pos[1] + j
            if i != 0 and j != 0:
                if not my_dict.get((nx, ny), 0):
                    return False
    return True

a = [[2,1],[1,3],[3,6],[5,5],[6,1],[7,3]]
n = len(a)
pos = [4, 3]
print(is_checkmate(a, n, pos))

อินพุต

[[2,1],[1,3],[3,6],[5,5],[6,1],[7,3]], 6, [4, 3]

เอาต์พุต

True