lc 51. N-Queens
阿新 • • 發佈:2019-01-10
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