Я пытаюсь решить проблему N Queens. Учитывая матрицу n на n, я должен вычислить все возможные решения, где могла бы присутствовать королева. На доске всегда будет N ферзей, но позиции каждой из них различны.
Мой алгоритм состоит из функции check
, которая выполняет полный поиск по доске, следя за тем, чтобы никакие две королевы не атаковали друг друга. Мой алгоритм тогда имеет функцию solve
, которая принимает board,col,n
в качестве своих параметров. Col представляет столбец доски, а n - длину.
Вот мой код:
def check(board,n): #does complete check of board
for col in range(n): #checks for horiz and vertical queens
rowQueens = 0
colQueens = 0
for row in range(n):
if board[col][row] == 1:
rowQueens += 1
if board[row][col]:
colQueens += 1
if rowQueens >= 2 or colQueens >= 2:
return False
queens = 0
for i in range(n): #checks for primary diagonal
if board[i][i]:
queens += 1
if queens >= 2:
return False
queens = 0
for i in range(n): #checks for secondary diagonal
if board[n-1-i][i]:
queens += 1
if queens >= 2:
return False
for i in reversed(range(1,n)): #checks diagonals from bottom
for j in range(n-1):
if board[i-1][j+1] == board[i][j] == 1:
return False
for i in range(n-1): #checks diagonals from top
for j in range(n-1):
if board[i][j] == board[i+1][j+1] == 1:
return False
return True
solutions = []
def solve(board,col,n):
if col == n:
solutions.append(board)
return
for i in range(n):
board[i][col] = 1
if check(board,n) == True:
solve(board,col+1,n)
else:
board[i][col] = 0
return False
n = 3
board = [[0] * n] * n
solve(board,0,n)
print(solutions)