流动python - 八皇后问题简单解决方案

思维:

  • 使用DFS.
  • 坐标的一维阵列的表达,在标行,元素列.A[i]=j它表示第一i女王就行了j柱.
  • 以穿越线,由线(从上到下),决定其列(左到右),所以,不要推断冲突的行,和主斜线副斜线冲突.
  • (行-列)标识主斜线, (行+列)标识副斜线.

以下上代码.

#coding=utf-8

#风格1
def queen(A, cur=0):
    if cur==len(A):
        print A
    else:
        for col in range(len(A)):
            A[cur] = col #表示把第cur行的皇后放在col列上
            ok = True
            for r in range(cur):
                if A[r]==col or r-A[r]==cur-A[cur] or r+A[r]==cur+A[cur]:#推断是否跟前面的皇后冲突
                    ok = False
                    break
            if ok:
                queen(A, cur+1)

#风格2
def queen(A, cur=0):
    if cur==len(A):
        print A
    else:
        for col in range(len(A)):
            A[cur] = col #表示把第cur行的皇后放在col列上
            for r in range(cur):
                if A[r]==col or r-A[r]==cur-A[cur] or r+A[r]==cur+A[cur]:#推断是否跟前面的皇后冲突
                    break
            else:
                queen(A, cur+1)


#风格3
def queen(A, cur=0):
    if cur==len(A):
        print A
    else:
        for col in range(len(A)):
            A[cur] = col #表示把第cur行的皇后放在col列上
            if all(A[r]!=A[cur] and r-A[r]!=cur-A[cur] and r+A[r]!=cur+A[cur] for r in range(cur)):#推断是否跟前面的皇后冲突
                queen(A, cur+1)


queen([None]*8)

这三种风格区别在于" 推断是否跟前面的皇后冲突"这里.

各自是ok flag -> for...else... -> all(导).

孰好孰坏了?

版权声明:本文博客原创文章,博客,未经同意,不得转载。

转载于:https://www.cnblogs.com/zfyouxi/p/4710151.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值