-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathn_queens.py
56 lines (40 loc) · 1.31 KB
/
n_queens.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
"""
n queens problem
"""
def is_board_in_legal_state(board):
for row_1 in range(len(board) - 1):
for row_2 in range(row_1 + 1, len(board)):
col_1 = board[row_1] - 1
col_2 = board[row_2] - 1
if col_1 == col_2:
return False
if abs(row_1 - row_2) == abs(col_1 - col_2):
return False
return True
def is_n_queen_solution(n, board):
return len(board) == n and is_board_in_legal_state(board)
def place_queens(n):
placements = [[]]
result = []
while placements:
current = placements.pop()
if is_n_queen_solution(n, current):
result.append(current)
for i in range(n, 0, -1):
new_state = current + [i]
# pruning
if len(set(new_state)) != len(new_state):
continue
if is_board_in_legal_state(new_state):
placements.append(new_state)
return result
# print(is_board_in_legal_state([2, 4, 1, 3]))
# print(is_board_in_legal_state([2, 4, 3, 1]))
# print(is_board_in_legal_state([2, 1, 4, 3]))
# print(is_board_in_legal_state([2, 2]))
# print(is_board_in_legal_state([1]))
# print(is_board_in_legal_state([0, 2, 1]))
print(place_queens(4))
print(place_queens(1))
print(place_queens(2))
print(place_queens(8))