# -*- coding: UTF-8 -*-
def recursion(cur, queens, total = 8):
'''
回溯法八皇后问题
list类型queens元素是皇后的位置
递归的格式为
深度判断定义出口
def recursion(depth):
if depth >= 8
return
for choice in all_choice:
record(choice)
recuresion(depth+1)
rollback(choice) 只要不破坏当前值,函数就能回溯。
'''
#出口
if cur == total:
print queens
return 0
for col in range(total):
flag = False
for row in range(len(queens)):
#不在斜线上,不是已经存在的列
if (abs(cur - row) == abs(col - queens[row])) or (col in queens):
flag = True
break
if flag:
continue
else:
#递归
queens.append(col)
#queens由于定义时未知长度,所以不能使用queens[cur] = col 这样赋值,因此用了append,回溯就要pop,而直接对固定长度的数组操作就不需要这样
recursion(cur+1, queens)
queens.pop()
#只要不破坏当前值,函数就能回溯。因此递归之后要pop
if __name__ == "__main__":
recursion(0, [])
或者,对固定长度的数组A[None]*8进行操作
def queen(A, cur=0):
if cur == len(A):
print(A)
return 0
for col in range(len(A)):
A[cur], flag = col, True#先给A赋值,后面col-A[row]是才不会报TypeError: unsupported operand type(s) for -: 'int' and 'NoneType'
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)