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

파이썬에서 기사의 공격

<시간/>

직사각형 체스 판을 나타내는 2차원 이진 행렬이 있다고 가정합니다. 여기서 0은 빈 셀이고 1은 기사입니다. 기사는 수평으로 2칸, 수직으로 1칸, 수직으로 2칸, 수평으로 1칸 이동할 수 있습니다(체스판 기사처럼). 두 기사가 서로를 공격하고 있는지 확인해야 합니다.

따라서 입력이 다음과 같으면

0 0 0 0 0
0 1 0 0 0
0 0 0 1 0

그러면 출력은 True

가 됩니다.

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

  • row, col :=행렬의 행 개수, 행렬의 열 개수
  • 0~1행 범위의 r에 대해
    • 0에서 col-1 범위의 c에 대해
      • A[r][c]가 0이 아니면
        • 각 nr, nc에서 [(r+1, c-2), (r+1, c+2), (r+2, c-1), (r+2, c+1)] , 하다
          • nr이 행 범위에 있고 nc가 col 범위에 있고 A[nr, nc]가 0이 아닌 경우
            • 참 반환
  • 거짓을 반환

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

예시

class Solution:
   def solve(self, A):
      row, col = len(A), len(A[0])
      for r in range(row):
         for c in range(col):
            if A[r][c]:
               for nr, nc in ((r+1, c-2), (r+1, c+2), (r+2, c-1), (r+2, c+1)):
                  if 0 <= nr < row and 0 <= nc <col and
                     A[nr][nc]:
                     return True
      return False
ob = Solution()
mat = [[0,0,0,0,0],
[0,1,0,0,0],
[0,0,0,1,0]]
print(ob.solve(mat))

입력

[[0,0,0,0,0],
[0,1,0,0,0],
[0,0,0,1,0]]

출력

True