Leetcode 面试题 08.12. 八皇后

设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行、不同列,也不在对角线上。这里的“对角线”指的是所有的对角线,不只是平分整个棋盘的那两条对角线。

注意:本题相对原题做了扩展

示例:

 输入:4

 输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]

 解释: 4 皇后问题存在如下两个不同的解法。

[

 [".Q..",  // 解法 1

  "...Q",

  "Q...",

  "..Q."],



 ["..Q.",  // 解法 2

  "Q...",

  "...Q",

  ".Q.."]

]

**难度**: Hard

**标签**: 回溯算法、


# -*- coding: utf-8 -*-
# @Author  : LG

"""
执行用时:60 ms, 在所有 Python3 提交中击败了88.57% 的用户
内存消耗:13.8 MB, 在所有 Python3 提交中击败了22.64% 的用户

解题思路:
    回溯
"""
class Solution:
    def solveNQueens(self, n: int) -> List[List[str]]:
        col_record = []     # 列记录
        dia1_record = []    # 对角线1记录
        dia2_record = []    # 对角线2记录
        result = []
        def backtrack(r, current):
            if r >= n:  # 如果最后一行也放置完成,则添加到最终结果中
                board = [['.' for _ in range(n)] for _ in range(n)]
                for r,c in current:
                    board[r][c] = 'Q'
                    board[r] = ''.join(board[r])
                result.append(board[:])
                return
            for c in range(n):  # 在本行中依次在每一列上进行放置
                if c not in col_record and r-c not in dia1_record and r+c not in dia2_record:   # 查看是否已经放置过
                    col_record.append(c)
                    dia1_record.append(r-c)
                    dia2_record.append(r+c)
                    backtrack(r+1, current+[(r, c)])    # 放置下一行
                    col_record.pop()
                    dia1_record.pop()
                    dia2_record.pop()
        backtrack(0, [])
        return result