可视化N皇后问题,terminal内运行可看见回溯过程
import time
from copy import deepcopy
def queen(n=8):
board = [["*"] * n for _ in range(n)]
res = []
def backtrack(bd, row):
# 过程打印
print("=" * n * 2 + "Trying Answer" + "=" * n * 2)
for b in bd:
print(f"\r{' '.join(b)}")
print("\033[F" * (n + 2))
time.sleep(0.5)
# 是否每行都试过
if row == n:
print("=" * n * 2 + f"Answer {len(res) + 1}" + "=" * n * 2)
for b in bd:
print(" ".join(b))
res.append(deepcopy(bd))
return
# 循环每列
for col in range(n):
# 是否符合条件
if not is_valid(board, row, col):
continue
bd[row][col] = "Q"
backtrack(bd, row + 1)
bd[row][col] = "*"
backtrack(board, 0)
return res
def is_valid(board, row, col):
length = len(board)
for r in range(row):
if board[r][col] == "Q":
return False
# 左上方
r, c = row, col
while r >= 0 and c >= 0:
if board[r][c] == "Q":
return False
r -= 1
c -= 1
# 左下方
r, c = row, col
while r < length and c >= 0:
if board[r][c] == "Q":
return False
r += 1
c -= 1
# 右上方
r, c = row, col
while r >= 0 and c < length:
if board[r][c] == "Q":
return False
r -= 1
c += 1
# 右下方
r, c = row, col
while r < length and c < length:
if board[r][c] == "Q":
return False
r += 1
c += 1
return True
if __name__ == "__main__":
import sys
try:
num = 4 if len(sys.argv) == 1 else int(sys.argv[-1])
except (TypeError, ValueError):
print("usage:\npython3 [this script] [queue number]")
exit(-1)
print(f"{num} Queens")
try:
queens = queen(num)
print(f"\r{'-'*num*2}Find Total: {len(queens)}{'-'*num*2}")
except KeyboardInterrupt:
...