python------解决八皇后问题

八皇后问题

- 背景

八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。

- 最简洁的八皇后代码

#八皇后问题,回溯+递归

def queen(A,cur = 0):  #定义cur为行数,0开始
    #判断当行数为列表长素时,则结束输出
    if cur == len(A): 
        print(A)
        return 0
    #进行列循环,col为列数
    for col in range (len(A)):
        #A[cur] 为cur 该行的列数
        A[cur] , flag = col ,True
        for row in range (cur):
            #这个核心判断 A[row] == col 为判断之前列上已有皇后,不能再放
            #abs(col - A[row]) == cur - row 用于判断之前位置皇后与现在皇后是否处于同一左右对角线上,处于对角线上的为一个等腰三角形,故行列之差相等,
            #又左上对角线为正,右下对角线为负,行列之差一定为正,故用绝对值使之相等
            if A[row] == col or abs(col - A[row]) == cur - row:
                flag = False
                break
        if flag:
            #递归,进入下一行判断
            queen(A,cur+1)

queen([None]*8)

- 结果共92种

  • `[0, 4, 7, 5, 2, 6, 1, 3]
    [0, 5, 7, 2, 6, 3, 1, 4]
    [0, 6, 3, 5, 7, 1, 4, 2]
    [0, 6, 4, 7, 1, 3, 5, 2]
    [1, 3, 5, 7, 2, 0, 6, 4]

    ………………….

    [7, 2, 0, 5, 1, 4, 6, 3]
    [7, 3, 0, 2, 5, 1, 6, 4]`


  • 这个可以用于4*4,5*5,6*6,等等,听说这也是很多公司笔试入门级题目,对于我来说也是写下来与大家共勉,这个代码我感觉还没有完全吃透,以后又新的体会在回过来改正。另外写代码还是要想同想懂之后再写,多想多写,我一直相信越努力越幸运,每个人都是幸运儿,fighting!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值