面试题:N皇后问题,思路和python解题笔记

本文详细介绍了N皇后问题的解题思路,包括棋盘上皇后不能互相攻击的摆放规则,以及如何处理横、竖、斜线的限制。通过分析得出正斜线攻击范围满足y=-x,负斜线攻击范围满足y+x=c的规律。采用回溯递归的方法实现算法,并给出了Python代码示例,最终输出所有可能的摆放方案。文章还提及了位运算优化解法,但未展开讲解。

n皇后问题算法思路和python解法

问题描述

n皇后问题,在n×n的棋盘上,解出n个皇后所有不能互相攻击的摆法,
皇后在数组中用“Q”表示,空地用“.”表示
返回的数据结构格式要求:[[“.Q…”,“…Q”,“Q…”,“…Q.”],[“…Q.”,“Q…”,“…Q”,“.Q…”]]
注:皇后在棋盘中的攻击范围是横、竖、左和右中位线的四个方向

解题思路分析

在这里插入图片描述

红色划线部分为皇后的攻击范围,不可以放另外一个皇后
横竖方向的限制很容易:只要与当前Q的行和列相同的索引的部分全部禁止即可

关键的难点是如何处理左右斜线方向的皇后禁止放置点

思考的时候从关键点出发,如果使用穷举判断的方式处理,需要在遍历每一行的时候都判断是否是前面所有已放置皇后的攻击范围,首先这个处理方式就需要增加一层1, 2, 到 n的循环,其次判断皇后的斜线攻击范围直接处理并不方便

因此着手于关键点继续思考,只有尝试寻找斜线方向攻击范围是否存在什么规律,如果能找到规律应该能减少不少的处理复杂度
这里就直接放结论了,规律的思考和寻找主要是靠自己多观察、学习和动手尝试
对于正斜线方向,对于图中的Q地点视为坐标系原点,往右方向是x轴,往下方向是y轴,那么左斜线攻击范围是一条y=-x的线,右斜线方向攻击范围是一条y=x的线
在这里插入图片描述

这是对于第一行的Q
对于其他行的Q,也有类似的规律,左斜线攻击范围满足y+x=c, 右斜线方向攻击范围满足y-x=c,c是一个常数
例如Q在第三行的第一个位置(2, 0),
那么第一行的(0, 2)和第二行的(1, 1)是左斜线的攻击范围(满足x+y=2的规律)
第四行的(3, 1)是右斜线的攻击范围(满足y-x=2的规律)

理解规律之后就剩下代码的逻辑处理了,

代码实现

# -*- coding:utf-8 -*-

class Solution:
    def solve_n_queens(self, n):
        # 1.定义一个二维数组用于存放Q在各行的位置(索引),每一个解法对应一个数组
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值