Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 수정된 체스판에 N 밤이 있을 때 왕이 유효한 이동을 이동할 수 있는지 확인하십시오.

<시간/>

체스와 같은 규칙을 가진 무한체스판이 하나 있고 무한체스판에 N개의 기사좌표와 왕좌표가 있다면 왕이 체크메이트인지 아닌지를 확인해야 한다. 무한판의 좌표는 (-10^9 <=x, y <=10^9)와 같이 큰 값으로 경계가 지정됩니다.

따라서 입력이 기사 위치 =[[2,1],[1,3],[3,6],[5,5],[6,1],[7,3]] 및 왕 위치와 같으면 :[4,3],

Python에서 수정된 체스판에 N 밤이 있을 때 왕이 유효한 이동을 이동할 수 있는지 확인하십시오.

킹은 이동이 없으므로 출력은 True가 됩니다. 따라서 체크 메이트입니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • my_dict :=새 지도
  • 0에서 n 사이의 i에 대해
    • 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 사이의 i에 대해
    • -1 ~ 1 범위의 j에 대해
      • nx :=king_pos[0] + 나
      • ny :=king_pos[1] + j
      • i가 0과 같지 않고 j가 0과 같지 않으면
        • my_dict[(nx, ny)]가 0이면
          • 거짓을 반환
  • 참 반환

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

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[(nx, ny)]:False 반환 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] 

출력

사실