สมมติว่าเรามีกระดานหมากรุกที่ไม่มีที่สิ้นสุดหนึ่งกระดานที่มีกฎเดียวกันกับหมากรุก และหากมีพิกัด N อัศวินบนกระดานหมากรุกที่ไม่มีที่สิ้นสุดและพิกัดของกษัตริย์ เราต้องตรวจสอบว่าพระราชาเป็นผู้รุกฆาตหรือไม่ พิกัดของกระดานไม่มีที่สิ้นสุดถูกล้อมรอบด้วยค่าขนาดใหญ่เช่น (-10^9 <=x, y <=10^9)
ดังนั้น ถ้าข้อมูลเข้าเหมือนตำแหน่งอัศวิน =[[2,1],[1,3],[3,6],[5,5],[6,1],[7,3]] และตำแหน่งกษัตริย์ :[4,3],
แล้วผลลัพธ์จะเป็นจริง เพราะราชาไม่มีการเคลื่อนไหว จึงเป็นเช็คเมท
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- my_dict :=แผนที่ใหม่
- สำหรับ i ในช่วง 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
- สำหรับฉันอยู่ในช่วง -1 ถึง 1 ทำ
- สำหรับ j ในช่วง -1 ถึง 1 ทำ
- nx :=king_pos[0] + i
- ny :=king_pos[1] + j
- ถ้าฉันไม่เหมือนกับ 0 และ j ไม่เหมือนกับ 0 แล้ว
- ถ้า my_dict[(nx, ny)] เป็นศูนย์ แล้ว
- คืนค่าเท็จ
- ถ้า my_dict[(nx, ny)] เป็นศูนย์ แล้ว
- สำหรับ j ในช่วง -1 ถึง 1 ทำ
- คืนค่า True
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
def is_checkmate(a, n, king_pos):my_dict ={} สำหรับ i ในช่วง (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 และ j !=0:if not my_dict[(nx, ny)]:return False return Truea =[[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]ก่อน>ผลลัพธ์
จริง