1. 程式人生 > >lc 51. N-Queens

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