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

本文通过八皇后问题详细阐述回溯法的运用,探讨如何在固定长度的数组中利用回溯策略解决排列冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# -*- 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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值