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