回溯法的公式——八皇后问题为例

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