leetcode刷题-51N皇后

题目

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

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

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

思路

这道题思路与37解数独完全一致,利用约束条件和回溯来解题,不同之处在于数独是唯一解,n皇后问题是多解。

因此程序不会中途停止,而是在成功后记录,继续删除现有元素,继续解题。

实现

class Solution:
    def solveNQueens(self, n) :
        table = [[False for _ in range(n)] for j in range(n)]
        result = [['.' for _ in range(n)] for j in range(n)]
        answer = []
        checkflag = False

        def put(i, j):
            tmp = []
            tmp1 = i + j
            tmp2 = i - j
            for l in range(n):
                for m in range(n):
                    if l == i or m == j or l + m == tmp1 or l - m == tmp2:
                        if table[l][m] == False:
                            table[l][m] = True
                            tmp.append((l, m))
            result[i][j] = "Q"
            return tmp

        def remove(i, j, tmp):
            for x in tmp:
                l = x[0]
                m = x[1]
                table[l][m] = False
            result[i][j] = "."

        def valid(i, j):
            if table[i][j] is False:
                return True

        def check(i, j):
            if i == n-1:
                res = []
                for w in result:
                    strtmp = "".join(w)
                    res.append(strtmp)
                answer.append(res)
                nonlocal checkflag
                checkflag = True
            else:
                for x in range(n):
                    backtrace(i + 1, x)


        def backtrace(row, col):
            #if result[row][col] == '.':
            if valid(row, col):
                tmp = put(row, col)
                check(row, col)
                remove(row, col, tmp)
        
        for t in range(n):
            backtrace(0, t)
            checkflag = False
            table = [[False for _ in range(n)] for j in range(n)]
            result = [['.' for _ in range(n)] for j in range(n)]
        return answer

 

posted @ 2020-08-04 11:00  maoguai  阅读(141)  评论(0编辑  收藏  举报