# 判断该位置的列、主对角线、次对角线是否满足要求
def could_place(row,col):
return not (cols[col] + hill_diagonals[row - col] + dale_diagonals[row + col])
# 放置皇后,并将皇后所处的列、主对角线、次对角线置1
def place_queen(row,col):
queens.add((row,col)) # 记录皇后的位置
cols[col] = 1
hill_diagonals[row - col] = 1
dale_diagonals[row + col] = 1
# 回溯,将在(row,column)方格的皇后移除
def remove_queen(row,col):
queens.remove((row,col))
cols[col] = 0
hill_diagonals[row - col] = 0
dale_diagonals[row + col] = 0
# 将皇后的位置,转换为符合输出的格式
def add_solution():
solution = []
for _,col in sorted(queens):
solution.append('.' * col + 'Q' + '.' * (n - col - 1))
output.append(solution)
# 摆放皇后
def backtrack(row=0):
for col in range(n):
if could_place(row,col):
place_queen(row,col)
if row + 1 == n:
add_solution()
else:
# 摆放第row+1行的皇后,若无恰当位置摆放,则进行回溯
backtrack(row + 1)
# 开始回溯,移除摆放的皇后,执行循环,跳跃到下一个列的位置,再验证
remove_queen(row,col)
n=4
cols = [0] * n # 其中的元素代表皇后所处位置的整个列
hill_diagonals = [0] * (2 * n - 1) # 其中的每一个元素代表一整条主对角线
dale_diagonals = [0] * (2 * n - 1) # 其中的每一个元素代表一整条次对角线
queens = set()
output = []
return output
if __name__ == '__main__':
res = backtrack()
print(res)