zoukankan      html  css  js  c++  java
  • 流动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(导).

    孰好孰坏了?

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

  • 相关阅读:
    ios 重构笔记
    ios uiwindow笔记
    ios静态库笔记
    ios app提交之前需要哪几个证书
    int、long、long long取值范围
    字节概述
    序列化概述
    LeetCode 最大连续子数列值
    198. LeetCode 打家劫舍
    git自定义关键字
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4710151.html
Copyright © 2011-2022 走看看