流动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(导).
孰好孰坏了?
版权声明:本文博客原创文章,博客,未经同意,不得转载。