• 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
  • 相关阅读:
    破周三,前不着村后不着店的,只好学pandas了,你该这么学,No.9
    周一不睡觉,也要把pandas groupy 肝完,你该这么学,No.8
    大周末的不休息,继续学习pandas吧,pandas你该这么学,No.7
    链接
    音乐
    术语
    新闻
    我的文章分类
    我的代码规则
    Jenkins 访问特别慢,且不消耗服务器资源
  • 原文地址:https://www.cnblogs.com/mgdzy/p/13431958.html
Copyright © 2020-2023  润新知