2020-09-03 N皇后

题目链接

参考链接

https://leetcode-cn.com/problems/n-queens/solution/li-kou-51xiao-bai-du-neng-kan-dong-de-nhuang-hou-j/

方法1 模拟

超时

class Solution:
    def solveNQueens(self, n: int) -> List[List[str]]:
            
        def genFlag(board):
            rows=n
            cols=n
            
            flag=[]
            for i in range(rows):
                flag.append([1]*cols)
                
            for i in range(rows):
                if 'Q' in board[i]:
                    px=i
                    py=board[i].index('Q')
                    
                    # 消除整列
                    for j in range(rows):
                        flag[j][py]=0
                    
                    # 消除左上角
                    tx=px-1
                    ty=py-1
                    while(tx>=0 and ty>=0):
                        flag[tx][ty]=0
                        tx-=1
                        ty-=1
                    # 消除右上角
                    tx=px-1
                    ty=py+1
                    while(tx>=0 and ty<cols):
                        flag[tx][ty]=0
                        tx-=1
                        ty+=1
                    # 消除左下角
                    tx=px+1
                    ty=py-1
                    while(tx<rows and ty>=0):
                        flag[tx][ty]=0
                        tx+=1
                        ty-=1
                    # 消除右下角
                    tx=px+1
                    ty=py+1
                    while(tx<rows and ty<cols):
                        flag[tx][ty]=0
                        tx+=1
                        ty+=1
                    
                    
            return flag

            
        def genFlag2(x,y,flag):
            rows=n
            cols=n
                

            px=x
            py=y
            
            # 消除整列
            for j in range(rows):
                flag[j][py]=0
            
            # 消除左上角
            tx=px-1
            ty=py-1
            while(tx>=0 and ty>=0):
                flag[tx][ty]=0
                tx-=1
                ty-=1
            # 消除右上角
            tx=px-1
            ty=py+1
            while(tx>=0 and ty<cols):
                flag[tx][ty]=0
                tx-=1
                ty+=1
            # 消除左下角
            tx=px+1
            ty=py-1
            while(tx<rows and ty>=0):
                flag[tx][ty]=0
                tx+=1
                ty-=1
            # 消除右下角
            tx=px+1
            ty=py+1
            while(tx<rows and ty<cols):
                flag[tx][ty]=0
                tx+=1
                ty+=1
            
                    
            return flag

        def finish(k):
            flag=1
            for i in k:
                flag*=i.count('Q')
            return flag>0

        out=[]
        st=[]
        if n==1:
            return [["Q"]]
        flags=[]
        import copy
        for i in range(n):
            tmpr1=['.']*n
            tmpr1[i]='Q'
            tmp=[tmpr1]
            for i in range(n-1):
                tmp.append(['.']*n)
            st.append(tmp)
            flags.append(genFlag(tmp))
        while(st):
            tmp=st.pop(0)
            flag=flags.pop(0)
            for i in range(n):
                if 'Q' not in tmp[i]:
                    # 找到放置所在行
                    for j in range(n):
                        if flag[i][j]==1:
                            k=copy.deepcopy(tmp)
                            k[i][j]='Q'
                            if finish(k):
                                k=[''.join(h) for h in k ]
                                if k not in out:
                                    out.append(k)
                            else:
                                if k not in st:
                                    st.append(k)
                                    flags.append(genFlag2(i,j,copy.deepcopy(flag)))
        return out

方法2 回溯

class Solution:
    def  solves(self, currentrow: int):
        if  currentrow == self.n:
            self.add_result()
            return
        for  i  in  range(self.n):
            if  i  not  in  self.col:
                if  i - currentrow in self.diagonal1 or i + currentrow in self.diagonal2:
                    continue
                self.col.append(i)
                self.diagonal1.append(i-currentrow)
                self.diagonal2.append(i+currentrow)
                self.solves(currentrow + 1)
                self.col.pop()
                self.diagonal1.pop()
                self.diagonal2.pop()
    def add_result(self):
        tem = []
        for num in self.col:
            tem.append('.' * num + 'Q' + '.' * (self.n - 1 - num))
        self.res.append(tem)
    def solveNQueens(self, n: int) -> List[List[str]]:
        self.n = n
        self.res = []
        self.col = []
        self.diagonal1, self.diagonal2 = [], []
        self.solves(0)

        return  self.res
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容