【LeetCode 困难题】1-N皇后

题目描述:皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

上图为 8 皇后问题的一种解法。

给定一个整数 n,返回所有不同的 皇后问题的解决方案。

每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.'分别代表了皇后和空位。

示例:

输入: 4
输出: [
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。

解法1。DFS回溯

class Solution(object):
    def solveNQueens(self, n):
        """
        :type n: int
        :rtype: List[List[str]]
        """
        if n <= 0:
            return []
        row = []
        col = [0]*n
        dia1 = [0]*(2*n-1)
        dia2 = [0]*(2*n-1)
        res = []
        self.dfs(n, 0, row, col, dia1, dia2, res)
        return res
    
    def dfs(self, n, index, row, col, dia1, dia2, res):
        if index == n:
            res.append(self.generateRes(n, row))
            return
        
        for i in range(n):
            if col[i]==0 and dia1[index+i]==0 and dia2[index-i+n-1]==0:
                row.append(i)
                col[i]=1
                dia1[index+i]=1
                dia2[index-i+n-1]=1
                self.dfs(n, index+1, row, col, dia1, dia2, res)
                row.pop()
                col[i]=0
                dia1[index+i]=0
                dia2[index-i+n-1]=0
        return
    
    def generateRes(self, n, row):
        if len(row)==n:
            board = [['.' for _ in range(n)] for _ in range(n)]
            for i in range(n):
                board[i][row[i]] = 'Q'
            fi=[]
            for lst in board:
                sub = ''
                for c in lst:
                    sub += c
                fi.append(sub)
            return fi

猜你喜欢

转载自blog.csdn.net/weixin_41011942/article/details/86296282
今日推荐