0이 빈 셀을 나타내고 1이 해당 셀의 체스 여왕을 나타내는 이진 행렬이 있다고 가정합니다. 이 보드를 채우고 유효한 nqueen 솔루션을 얻을 수 있는지 여부를 확인해야 합니다. 우리가 알고 있는 바와 같이 n개의 퀸즈 퍼즐은 두 개의 체스 퀸이 서로를 공격할 수 없도록 n × n개의 체스판에 n개의 퀸을 놓아야 합니다.
따라서 입력이 다음과 같으면
1 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 1 |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 1 | 0 |
하나의 솔루션이 −
와 같으므로 출력은 True가 됩니다.1 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 0 |
0 | 0 | 0 | 0 | 1 |
0 | 1 | 0 | 0 | 0 |
0 | 0 | 0 | 1 | 0 |
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
isSafe() 함수를 정의합니다. 이것은 보드, i, j가 걸릴 것입니다
-
범위 0에서 보드 크기까지의 r에 대해
-
r이 i와 같지 않고 board[r, j]가 1과 같으면
-
거짓을 반환
-
-
-
r :=i + 1, c :=j + 1
-
동안 r <보드의 행 크기 및 c <보드의 열 크기, do
-
보드[r, c]가 1과 같으면
-
거짓을 반환
-
-
r :=r + 1, c :=c + 1
-
-
r:=i + 1, c :=j - 1
-
동안 r <보드의 행 크기 및 c>=0, 수행
-
보드[r, c]가 1과 같으면
-
거짓을 반환
-
-
r :=r + 1, c :=c - 1
-
-
r :=i - 1, c :=j + 1
-
동안 r>=0 및 c <보드의 열 크기, 수행
-
보드[r, c]가 1과 같으면
-
거짓을 반환
-
-
r :=r - 1, c :=c + 1
-
-
r :=i - 1, c :=j - 1
-
r>=0 및 c>=0인 동안 수행
-
보드[r, c]가 1과 같으면
-
거짓을 반환
-
-
r :=r - 1, c :=c - 1
-
-
참을 반환
-
주요 방법에서 다음을 수행하십시오 -
-
r :=0, c :=0
-
스택 :=새 스택
-
동안 r <보드의 행 크기, 수행
-
보드[r]에 1이 있으면
-
r :=r + 1
-
다음 반복으로 이동
-
-
그렇지 않으면
-
발견됨 :=거짓
-
동안 c <보드의 열 크기, 수행
-
isSafe(board, r, c)가 참이면
-
보드[r, c] :=1
-
스택에 [r, c] 삽입
-
찾았습니다 :=참
-
루프에서 나오다
-
-
c :=c + 1
-
-
찾은 것이 사실이면
-
c :=0, r :=r + 1
-
-
그렇지 않으면
-
스택이 비어 있으면
-
거짓을 반환
-
-
m :=스택에서 최상위 요소 삭제
-
r :=m[0], c :=m[1] + 1
-
보드[r, c - 1] :=0
-
-
-
-
참을 반환
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
class 솔루션:def solve(self, board):def isSafe(board, i, j):for r in range(len(board)):if r !=i and board[r][j] ==1:False 반환 r, c =i + 1, j + 1 동안 r=0:board[r][c] ==1:False를 반환합니다. r +=1 c -=1 r, c =i - 1, j + 1 동안 r>=0 및 c =0 및 c>=0:board[r][c] ==1:False 반환 r -=1 c -=1 반환 True r =c =0 스택 =[] while r 입력
<미리>[ [1, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 1],[0, 0, 0, 0, 0 ], [0, 0, 0, 1, 0] ]
출력
사실