lc 51. N-Queens

https://leetcode.com/problems/n-queens/

才发现这么经典的题目之前并没有真正写过。

不同行,不同列,不同对角线。

不同行:直接每行一个。

不同列:set储存哪些列被占用了。其实最好用list[bool]来做。

不同对角线:如果挨个check前面的可能性,那么不就成了n^3的解法了吗。但是你想一下,对角线就是/这样子的有2*n个,\这样子的有2*n个,每选定一个点就会占据两条对角线,于是乎,也能用set或者list[bool]来做。

今日份长进:

在写递归的时候,会在进入下一层递归前后各写一个维护state的变量组,如下:

s,path都要围绕着递归函数。

其实可以有种简洁,却费空间的方法,就是传一份复制的给下一层,如下:

这样会省代码,费空间,学习了。

 代码:

class Solution:
    def path2list(self,p):
        ans=[]
        for i in p:
            ans.append('.'*i+'Q'+'.'*(len(p)-i-1))
        return ans
    def node(self,n,s,ans,path=[],r=-1):
        r+=1
        if r==n:
            ans.append(self.path2list(path))
            return
        for i in range(n):
            if r+i in s[0] or r-i in s[1] or i in s[2]:
                continue
            s[0].add(r+i)
            s[1].add(r-i)
            s[2].add(i)
            path.append(i)
            self.node(n,s,ans,path,r)
            s[0].remove(r+i)
            s[1].remove(r-i)
            s[2].remove(i)
            path.pop()
    def solveNQueens(self, n):
        s=[set(),set(),set()]
        ans=[]
        self.node(n,s,ans)
        return ans

 

posted @ 2019-01-10 13:44  Cloud.9  阅读(96)  评论(0编辑  收藏  举报