Python/backtracking/n_queens.py

91 lines
2.5 KiB
Python
Raw Normal View History

2019-10-05 05:14:13 +00:00
"""
The nqueens problem is of placing N queens on a N * N
chess board such that no queen can attack any other queens placed
on that chess board.
This means that one queen cannot have any other queen on its horizontal, vertical and
diagonal lines.
2019-10-05 05:14:13 +00:00
"""
from typing import List
solution = []
2019-10-05 05:14:13 +00:00
def isSafe(board: List[List[int]], row: int, column: int) -> bool:
2019-10-05 05:14:13 +00:00
"""
This function returns a boolean value True if it is safe to place a queen there
considering the current state of the board.
Parameters :
board(2D matrix) : board
row ,column : coordinates of the cell on a board
Returns :
Boolean Value
2019-10-05 05:14:13 +00:00
"""
for i in range(len(board)):
if board[row][i] == 1:
return False
for i in range(len(board)):
if board[i][column] == 1:
return False
2019-10-05 05:14:13 +00:00
for i, j in zip(range(row, -1, -1), range(column, -1, -1)):
if board[i][j] == 1:
return False
2019-10-05 05:14:13 +00:00
for i, j in zip(range(row, -1, -1), range(column, len(board))):
if board[i][j] == 1:
return False
return True
2019-10-05 05:14:13 +00:00
def solve(board: List[List[int]], row: int) -> bool:
2019-10-05 05:14:13 +00:00
"""
It creates a state space tree and calls the safe function until it receives a
False Boolean and terminates that branch and backtracks to the next
possible solution branch.
2019-10-05 05:14:13 +00:00
"""
if row >= len(board):
2019-10-05 05:14:13 +00:00
"""
If the row number exceeds N we have board with a successful combination
and that combination is appended to the solution list and the board is printed.
2019-10-05 05:14:13 +00:00
"""
solution.append(board)
printboard(board)
print()
return True
for i in range(len(board)):
2019-10-05 05:14:13 +00:00
"""
For every row it iterates through each column to check if it is feasible to
place a queen there.
If all the combinations for that particular branch are successful the board is
reinitialized for the next possible combination.
2019-10-05 05:14:13 +00:00
"""
if isSafe(board, row, i):
board[row][i] = 1
2019-10-05 05:14:13 +00:00
solve(board, row + 1)
board[row][i] = 0
return False
2019-10-05 05:14:13 +00:00
def printboard(board: List[List[int]]) -> None:
2019-10-05 05:14:13 +00:00
"""
Prints the boards that have a successful combination.
2019-10-05 05:14:13 +00:00
"""
for i in range(len(board)):
for j in range(len(board)):
if board[i][j] == 1:
2019-10-05 05:14:13 +00:00
print("Q", end=" ")
else:
print(".", end=" ")
print()
2019-10-05 05:14:13 +00:00
# n=int(input("The no. of queens"))
n = 8
2019-10-05 05:14:13 +00:00
board = [[0 for i in range(n)] for j in range(n)]
solve(board, 0)
print("The total no. of solutions are :", len(solution))