【LeetCode 困難題】1-N皇后
阿新 • • 發佈:2019-01-11
題目描述:n 皇后問題研究的是如何將 n 個皇后放置在 n×n 的棋盤上,並且使皇后彼此之間不能相互攻擊。
上圖為 8 皇后問題的一種解法。
給定一個整數 n,返回所有不同的 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