leetcode 51 N皇后问题

通过回溯方法解决,构建一棵树,然后根据N皇后不互相攻击的限制条件,不在同一行,同一列,以及同一对角线上,其中对角线注意是两个方向的。不过判断条件都是对应行列坐标作差绝对值相等。

这个题目自己随便改改,居然accepted了,开心,再去看看其他解法!

class Solution:
    def solveNQueens(self, n: int) -> List[List[str]]:
        def dfs(i,n,path,result):
            flag=[True,True,True,True]
            if i==n:
                strvalue=''
                res=[]
                for m in range(n):
                    for k in range(n):
                        if k==path[m]:
                            strvalue+='Q'
                        else:
                            strvalue+='.'
                    res.append(strvalue)
                    strvalue=''
                result.append(res)
                return 

            for j in range(n):
                flag=False
                if path:          
                    for index,item in enumerate(path):
                        if abs(j-item)==abs(i-index) or j==item:
                            flag=True
                            break
                    if not flag:
                        dfs(i+1,n,path+[j],result)

                else:
                    path.append(j)
                    dfs(i+1,n,path,result)
                    path.pop()


        result=[]
        dfs(0,n,[],result)
        return result

按照答案写了一遍,把判断是否N皇后的问题交给数组,把之前的列值,与坐标的加和和坐标的差值,都放入数组中,如果当前位置的坐标在对应的数组中,那么就不满足条件。
其中需要注意的是,左对角线上的坐标作差相等,右对角线上的坐标作和相等。
其中打印答案也封装在一个函数中。

class Solution:
    def solveNQueens(self, n: int) -> List[List[str]]:
        def print_result(column):
            strvalue=''
            res=[]
            for m in range(len(column)):
                for k in range(len(column)):
                    if k==column[m]:
                        strvalue+='Q'
                    else:
                        strvalue+='.'
                res.append(strvalue)
                strvalue=''
            return res
        def dfs(i,n,column,diagonal_left,diagonal_right,result):

            if i==n:
                res=print_result(column)
                result.append(res)
                return 

            for j in range(n):

                if j  in column or i+1-j in diagonal_left or i+1+j  in diagonal_right:
                    continue
                else:
                    column.append(j)
                    diagonal_left.append(i-j+1)
                    diagonal_right.append(j+i+1)
                    dfs(i+1,n,column,diagonal_left,diagonal_right,result)
                    column.pop()
                    diagonal_left.pop()
                    diagonal_right.pop()

        result=[]
        dfs(0,n,[],[],[],result)
        return result
动态规划 文章被收录于专栏

给自己归纳复习的一些做过的题目,写得很乱,大家可以按照这个题目去针对性做题,确实会有提升!

全部评论

相关推荐

黑皮白袜臭脚体育生:简历统一按使用了什么技术实现了什么功能解决了什么问题或提升了什么性能指标来写会更好另外宣传下自己的开源仿b站微服务项目,GitHub已经410star,牛客上有完整文档教程,如果觉得有帮助的话可以点个小星星,蟹蟹
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务