# -*- 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)