八皇后问题

本文探讨了经典的八皇后问题,通过递归算法在8×8的棋盘上放置八个皇后,确保它们不在同一行、列或斜线上。文章详细介绍了递归函数的工作原理,并提供了完整的Python代码实现。

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

          在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

 

一    递归解法

def conflict(state,nextX):
    '''
    判断接下来的皇后位置是否与前边发生冲突
    state   存储前边所有的皇后位置,即X轴
    nextX   即接下来皇后的x轴坐标
    '''
    nextY = len(state)    #接下来皇后的Y轴坐标

    for i in range(nextY):
        '''
        依次与前边皇后位置进行判断
        '''
        if  abs(state[i]-nextX) in (0,nextY-i): # 0代表当前皇后与接下来这个皇后在同一列   nextY-i代表在一对角线
            return True
    return False


def queens(num,state=() ):
    '''
    结合前边的皇后位置,判断下一个皇后位置(x轴坐标)
    '''
    for pos in range(num):            #每次确定一个x轴位置  依次与前边的皇后位置判断  是否发生了冲突
        if not conflict(state,pos):
            if len(state) == num-1:   #如果是最后一个皇后位置
                yield (pos,)          #  yield跟return 用法相同  但return完直接结束  跳出函数  而yield不会退出  接着执行
            else:
                '''
                递归过程
                '''
                for result in queens(num,state + (pos,)):   #元祖相加  (1,)+(2,) = (1,2)
                    yield (pos,) + result

print(list(queens(8)))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值