回溯法
def queen(A, cur=0):
if cur == len(A): # 当列遍历到达第9列,表示一个八皇后序列生成,结束本轮回溯
print(A) # 打印该序列
return 0
for col in range(len(A)):
A[cur], flag = col, True# 初始化当前列的皇后在第0行,flag=True
for row in range(cur): # 判别当前列初始化后与其他皇后是否冲突,如果冲突结束循环,在下一轮中将当前皇后下移一行
if A[row] == col or abs(col - A[row]) == cur - row: # 判断对角线,横轴差=纵轴差
flag = False
break
if flag:
queen(A, cur + 1) # 如果当前皇后位置与其他皇后不冲突,则搜索下一个皇后的位置
queen([None]*8) #[None, None, None, None, None, None, None, None]
下面的代码与上面的相同,注意cur是当前列,A[cur]=col是当前列皇后所在的行;row是遍历当前皇后之前的所有皇后的列,A[row]是皇后所在的行。下面的代码更容易理解。
def queen(A, cur = 0):
if cur == len(A):
print(A)
return 0
for col in range(len(A)):
A[cur] = col
flag = True
for row in range(cur):
if A[cur] == A[row] or abs(cur - row) == abs(A[cur] - A[row]):
flag = False
break
if flag:
queen(A, cur + 1)
queen([None] * 8)