回溯法的公式——八皇后問題爲例

# -*- 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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章