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

Python에서 N Queens 솔루션을 얻을 수 있는지 여부를 확인하는 프로그램

<시간/>

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] ]

출력

사실