代码随想录 -- 回溯 -- N皇后

51. N 皇后 - 力扣(LeetCode)

题解:

从抽象树中可以看出递归的层数取决于棋盘的行数,for循环的次数取决于棋盘的列数。

  • 递归参数:存放当前棋盘的数组chessboard、当前行row、总行数n。
  • 递归终止条件:当 row 等于 n 的时候收集结果并返回。
  • 单层递归逻辑:在当前行、当前列添加皇后符合题意时:将皇后加入棋盘;递归调用进行下一行的皇后放置;将皇后移出棋盘(回溯)。

注意判定在当前行、当前列添加皇后是否符合题意的函数:

  • 无需判断行
  • 判断列
  • 判断斜左上方
  • 判断斜右上方
class Solution(object):
    def back(self,chessboard,n,row):
        if row==n:
            self.result.append(chessboard[:])
            return
        for i in range(n):
            if self.isValid(chessboard,row,i,n):
                chessboard[row]=chessboard[row][:i]+'Q'+chessboard[row][i+1:]
                self.back(chessboard,n,row+1)
                chessboard[row]=chessboard[row][:i]+'.'+chessboard[row][i+1:]

    def isValid(self,chessboard,row,cul,n):
        for i in range(row):
            if chessboard[i][cul]=='Q':
                return False

        i,j=row-1,cul-1
        while i>=0 and j>=0:
            if chessboard[i][j]=='Q':
                return False
            i-=1
            j-=1
        
        i,j=row-1,cul+1
        while i>=0 and j<n:
            if chessboard[i][j]=='Q':
                return False
            i-=1
            j+=1

        return True

    def solveNQueens(self, n):
        self.result=[]
        self.back(['.'*n for _ in range(n)],n,0)
        return self.result

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值