n皇后--python

n皇后

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

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

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

力扣上的第51题
这道题困扰了我好久,一直都不会(流泪),看来很多资料,现在终于会做了

话不多说
N皇后是回溯的经典问题,想要解决这个问题,我们首先想要知道回溯是什么

什么是回溯算法
回溯算法,一种通过探索所有可能的候选解来找出所有的解的算法。

它采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。回溯法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况:

找到一个可能存在的正确的答案; 在尝试了所有可能的分步方法后宣告该问题没有答案。

解题思路
我们用一个for循环来遍历列,用回溯来遍历行。
列如,我们想要在第一行第一列放皇后,那么我们需要先判断此位置是不是可以放皇后,所以需要写一个判断当前位置能否放置皇后的函数,当第一行第一列可以放置时,通过回溯到达下一行,接着判断,依次执行,直到运行到第n行时,将结果放入到结果集中。

代码

def is_vaild(row,col,board):
    for i in range(row):
        if board[i][col]=='Q':
            return False
    for j in range(col):
        if board[row][j]=='Q':
            return False
    i=row-1
    j=col-1
    while i>=0 and j>=0:
        if board[i][j]=='Q':
            return False
        i-=1
        j-=1
    i=row-1
    j=col+1
    while i>=0 and j<n:
        if board[i][j]=='Q':
            return False
        i-=1
        j+=1
    return True
def backtrack(row,board):
    global result
    if row==n:
        res=[]
        for i in board:
            res.append("".join(i))
        result.append(res)
        return 
    for col in range(n):
        if is_vaild(row,col,board):
            board[row][col]='Q'
            backtrack(row+1,board)
            board[row][col]='.'
if __name__=='__main__':
    n=4
    board=[['.' for i in range(n)]for i in range(n)]
    result=[]
    backtrack(0,board)
    print(result)       



执行结果

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学无止境****

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值