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(导).

    孰好孰坏了?

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

  • 相关阅读:
    MT【347】单变量求最值
    MT【346】拐点处分界
    MT【345】三个绝对值的和
    MT【344】构造函数
    MT【343】三数平方法
    MT【342】条件为非负实数
    MT【341】换元变形
    MT【340】彭塞列闭合定理
    MT【339】待定系数
    MT【338】分式变形
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4710151.html
Copyright © 2011-2022 走看看