Leetcode刷题记录——51. N皇后

在这里插入图片描述
此解法学习自左程云老师的《程序员代码面试指南》
皇后放置的规则就是 已经放置皇后的位置的同行 同列 45° 135° 方向均不许有皇后
对于nxn的棋盘,要放满皇后,需每行都放置皇后
因此,准备一个数组record 长度为n
record[i]代表第i行的皇后所在的列数

回溯法
设置递归函数 输入为 i 即之前已经填进去的皇后个数,
record,里面装有了前i个皇后对应的列数
n,棋盘边长

当i==n时,我们记录这时的结果即可
否则 record还没满
即可 递归 填充下一行的皇后位置
在递归时 需要遍历n
遍历到k时 需要判断k是否已经在record里出现过 或者k,record[k]是否与record此前的任一个(i,j)在同一斜线上
若满足上面任何一种情况 k都不能被算作下一个皇后
若都不满足,即可将k记录在record中 并遍历下一层

class Solution:
    def __init__(self):
        self.res = []
        self.base = ''
    def solveNQueens(self, n: int) -> List[List[str]]:
        if n < 1:
            return 0
        for kk in range(n):
            self.base += '.'
        record = []
        self.rec(0,[],n)
        return self.res

    def rec(self,i,record,n):
        #在第i列放皇后
        if i == n:#已经放了n列 返回1
            #print(record)
            this_solution = []
            for mm in range(n):
                this_loc = record[mm]
                this_res = self.base
                this_res = this_res[:this_loc] + 'Q' + this_res[this_loc+1:]
                #this_res[this_loc] = 'Q'
                this_solution.append(this_res)
            self.res.append(this_solution)
            return 0
        res = 0
        for j in range(n):#对于每一列
            if self.isvalid(i,record,j):#j不出现在record的前i个元素里 且 对于每一个比i小的k 有|record[k] - j| != |k-i|
                self.rec(i+1,record+[j],n)
        return res
    
    def isvalid(self,i,record,j):
        for k in range(i):
            if j == record[k] or (abs(record[k]-j)==abs(k-i)):
                return False

        return True
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值