n皇后的二进制做法

本文介绍了使用二进制技巧解决N皇后问题的方法。提到关键点在于理解每个皇后放置后,会影响其所在列及前后列向下数行的位置,限制其他皇后在此区域的放置。
摘要由CSDN通过智能技术生成

ps:其实只能跑到14;
引用一张图片:

对于某一个放上皇后的点来说,其对于下几行的影响为其所在的列及其(前后列)*向下的行数;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,t,ans;
void dfs(int a,int b,int c)
{
    if(a == t) {ans ++;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用位运算可以进一步优化n皇后问题的求解过程。 假设我们用一个n位二进制数表示一个棋盘的状态,其中1表示该位置上放置了皇后,0表示该位置为空。那么在每一行中,只能有一个位置上放置皇后,而在每一列、每一条对角线上,也只能有一个皇后。因此,我们可以用三个n位二进制数分别表示列、对角线和反对角线的占用情况,其中1表示该位置已经被占用,0表示该位置为空。 例如,在一个4×4的棋盘上,如果第1行第2列放置了皇后,则该行的状态为0001,第2列的状态为0010,左上到右下的对角线状态为0100,右上到左下的反对角线状态为0010。 具体求解过程如下: 1. 初始化列、对角线和反对角线的占用情况为0。 2. 从第1行开始,对于每一行,从左到右依次尝试放置皇后。如果该位置所在的列、对角线和反对角线都没有被占用,则将该位置的状态设为1,并更新列、对角线和反对角线的占用情况。然后递归到下一行继续放置皇后。 3. 如果已经放置了n个皇后,则找到了一个解,输出该解。 4. 如果当前行已经尝试了所有的位置,或者当前行的所有位置都与列、对角线和反对角线冲突,则回溯到上一行,重新尝试放置皇后。 使用位运算可以加快判断某个位置是否被占用的速度,从而提高求解效率。例如,判断某个位置是否在对角线上可以通过行号减去列号的差来判断,即如果两个位置的行号之差等于列号之差或者行号之和等于列号之和,则它们在同一条对角线上。这个判断过程可以用位运算来实现,具体实现方式可以参考下面的代码: ```python def solveNQueens(n: int) -> List[List[str]]: def dfs(row, cols, diagonals, antidiagonals, path, res): if row == n: res.append(path) return for col in range(n): diagonal, antidiagonal = row - col, row + col if col in cols or diagonal in diagonals or antidiagonal in antidiagonals: continue dfs(row + 1, cols | {col}, diagonals | {diagonal}, antidiagonals | {antidiagonal}, path + ["." * col + "Q" + "." * (n - col - 1)], res) res = [] dfs(0, set(), set(), set(), [], res) return res ``` 这段代码使用了Python中的set来表示列、对角线和反对角线的占用情况,其中cols表示列的占用情况,diagonals表示对角线的占用情况,antidiagonals表示反对角线的占用情况。在递归过程中,每次都会将当前位置所在的列、对角线和反对角线的占用情况加入到集合中,以便在下一行继续使用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值