직사각형 체스 판을 나타내는 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이 아닌 경우
- 참 반환
- nr이 행 범위에 있고 nc가 col 범위에 있고 A[nr, nc]가 0이 아닌 경우
- 각 nr, nc에서 [(r+1, c-2), (r+1, c+2), (r+2, c-1), (r+2, c+1)] , 하다
- A[r][c]가 0이 아니면
- 0에서 col-1 범위의 c에 대해
- 거짓을 반환
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
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