체스와 같은 규칙을 가진 무한체스판이 하나 있고 무한체스판에 N개의 기사좌표와 왕좌표가 있다면 왕이 체크메이트인지 아닌지를 확인해야 한다. 무한판의 좌표는 (-10^9 <=x, y <=10^9)와 같이 큰 값으로 경계가 지정됩니다.
따라서 입력이 기사 위치 =[[2,1],[1,3],[3,6],[5,5],[6,1],[7,3]] 및 왕 위치와 같으면 :[4,3],
킹은 이동이 없으므로 출력은 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이면
- 거짓을 반환
- my_dict[(nx, ny)]가 0이면
- -1 ~ 1 범위의 j에 대해
- 참 반환
예
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
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]사전>출력
사실