n皇后最快算法详解

article/2025/10/14 4:02:45

n皇后问题再经典不过了,想必大家也听说过。
再简单说一下吧,就是一个n*n的棋盘,放置n个皇后,使得竖着不攻击,横着不攻击,斜着不攻击。求有多少种方法。
nQueens
国际象棋不是这么玩的呀
向来网上都是经典的题目配经典的解法,用一个矩阵记录哪里放了,回溯一下,每一次遍历每一个皇后,判断会不会被攻击。。。
然而,比蜗牛🐌还慢!!数据大一丁点,宇宙毁灭了都算不完,可见得有多慢啊!!
复杂度为:O(nn)你说可怕不可怕
(⊙o⊙)
能不能快一点?可以滴:


先来代码:

(讲真,下面代码简直是一个二进制操作套餐。。。)

#include <bits/stdc++.h>using namespace std;
typedef long long ll;ll sum, mark;
void test(ll row, ll ld, ll rd)
{if(row != mark){ll pos = mark & ~(row | ld | rd);while(pos) {ll p = pos & -pos; pos -= p; test(row + p, (ld + p) << 1, (rd + p) >> 1); }}elsesum++;
}int main()
{ios::sync_with_stdio(false);int n;cin >> n;sum = 0, mark = 1;mark = (mark << n) - 1;test(0, 0, 0);cout<<sum;return 0;
}

我看了是一脸懵???(⊙_⊙)?什么玩意,这这这,,
在一位大佬的指点下,终于明白了。我的理解:
首先这个算法是从上往下,从右往左扫描的
其次,我们细细看一看:
mark,是有n个1(二进制)的数
比如

nmarkmark的二进制
111
2311
37111
4151111

或者说,把棋盘其中一行的每一格写上1,这一行对应的10进制就是mark。
如果还没有明白的话,请温习二进制===
重点部分来了:
当当当敲黑板!!
看一看test函数
row啥意思呢? 其实这个名字我觉得不好,应该叫col,表示哪些列有坑(坑代表在这里会被攻击)。有坑的列为1,没有的为0.
ld代表左斜的坑。额,咋说捏,上图吧。
ld
假设遍历到了第3行,这时的ld是0010.
其实是10010,但是代码里给&mark,所以前面不管怎样,都被忽略了,所以把它当成0010吧。其实更建议在传参的时候就给&一下,以免数太大出各种问题。。
rd代表右斜的坑。一样的,上面理解了这里也能理解吧
rd
如果row==mark,说明都放满了。恭喜恭喜啦啦啦!!找到了一个成功方案(~ ̄▽ ̄)~(●ˇ∀ˇ●)φ(゜▽゜*)♪
否则呢,只能苦苦滴继续算了≡(▔﹏▔)≡
pos代表这行哪些位置能放,能放即为1,不能就是0.
当然,不能放的超出棋盘啦,所以要&一下
Then,遍历哪里能放,,
pos & -pos取得最后一个为1的位,就是lowbit。
如果懂的话,可以无视这段内容:


-pos会把pos取反+1(不知道的童鞋请温习补码),那么末尾的那些0会咋样呢?
取反码,末尾0段都变成1了,再加1,全往前进位,所以变成了10000…
前面呢?既然取反,所以全都变成0了(因为0&1=0)。
举个栗子:
pos=010100
~pos=101011
((~pos)+1)=-pos=101100
-pos&pos=100


那么遍历了这个1,需要把它去掉,否则后果不堪设想(就是传说中的while(1))
然后呢,递归。
因为这一列已经放了,所以要在这里标一个1,说明如果往这里再放皇后将会被干掉。
那么接下来两个参数,,
首先,左斜斜率为1,自然y往下一点对应的x也会往左,所以左移。记得别忘了加上p。
右斜斜率为-1,每一次y往下对应的x会往右,所以右移。
栗子:
test()
是不是有一点乱,,那么,换一个更简单的栗子吧
Easyer
然后呢,就继续回溯吧。。。直到算出来
改版代码:


// nQueen.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <bits/stdc++.h>using namespace std;
typedef long long ll;ll sum, mark;
//mark是有n个1(二进制)的数
//sum是解
void test(ll col, ll ld, ll rd)
//col是哪些列有皇后
//ld是当前行哪些位置会被左斜攻击
//rd是当前行哪些位置会被右斜攻击
{if (col != mark)//如果没算完的话,只能继续算了呜呜呜{ll pos = mark & ~(col | ld | rd);//获取哪些位置能放while (pos){ll p = pos & -pos;//取得最靠后的1位pos -= p;//去掉test(col | p, ((ld | p) << 1) & mark/*谨防溢出*/, (rd | p) >> 1);//计算下一行}}elsesum++;//啦啦啦啦算到了一个解啦啦啦啦
}int main()
{ios::sync_with_stdio(false);int n;cin >> n;sum = 0, mark = 1;mark = (mark << n) - 1;//以上初始化↑test(0, 0, 0);//计算cout << sum;//输出return 0;
}// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

已知数据:(嘿嘿~其实这个是从网上抄滴)
1 1
2 0
3 0
4 2
5 10
6 4
7 40
8 92
9 352
10 724
11 2680
12 14200
13 73712
14 365596
15 2279184
16 14772512
17 95815104
18 666090624
19 4968057848
20 39029188884
21 314666222712
22 2691008701644
23 24233937684440
24 227514171973736
25 2207893435808352



http://chatgpt.dhexx.cn/article/oNmLQCVa.shtml

相关文章

51. N 皇后

51. N 皇后 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方…

51. N皇后

51. N皇后 https://leetcode-cn.com/problems/n-queens/ 四皇后的解 n个皇后&#xff0c; nn 的棋盘上 根据要求 每行有且仅有一个皇后&#xff08;如果有一行没有那么必有一行至少两个皇后&#xff0c;不符合&#xff09; 递归回溯&#xff0c;每次尝试在一行中摆放皇后&…

递归算法——n皇后

** 递归算法——n皇后 ** n皇后问题&#xff1a; 输入整数n&#xff0c;要求n个国际象棋的皇后&#xff0c;摆在n*n的棋盘上&#xff0c;互相不能攻击&#xff0c;输出全部方案。 输入&#xff1a; 输入一个正整数N。 输出&#xff1a; 程序输出N皇后问题的全部摆法。 行里…

kettle连接mysql教程_KETTLE初学者使用教程

Kettle的建立数据库连接、使用kettle进行简单的全量对比插入更新:kettle会自动对比用户设置的对比字段,若目标表不存在该字段,则新插入该条记录。若存在,则更新。 Kettle简介:Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,数据抽取高效稳…

Kettle Spoon 安装配置详解

文章目录 1 概述2 安装2.1 软件下载2.2 JDK 环境变量配置2.3 数据库驱动包下载2.4 双击 Spoon.bat 启动 3 简单使用3.1 transformation 转换3.1.1 文件 - 新建 - 转换3.1.2 核心对象 - 输入 - 表输入3.1.3 核对对象 - 输出 - 插入/更新3.1.4 保存 - xxx.ktr 3.2 job 作业3.2.1 …

Spoon安装步骤

主数据库连接步骤 主对象树点击转换&#xff0c;双击DB连接 配置信息完成后点击测试成功 二&#xff0e;源数据库连接步骤 1.点击Connect,点击other repositories 2.点击Database Repository 编辑名称&#xff08;注意必须用英文&#xff09; 再点击数据库连接 配置选项 …

kettle下载安装使用教程

Kettle简介 Kettle是一款国外开源的ETL工具&#xff0c;纯java编写&#xff0c;可以在Window、Linux、Unix上运行&#xff0c; 数据抽取高效稳定。Kettle 中文名称叫水壶&#xff0c;该项目的主程序员MATT 希望把各种数据放到一个壶里&#xff0c;然后以一种指定的格式流出。K…

KETTLE使用教程

Kettle的建立数据库连接、使用kettle进行简单的全量对比插入更新&#xff1a;kettle会自动对比用户设置的对比字段&#xff0c;若目标表不存在该字段&#xff0c;则新插入该条记录。若存在&#xff0c;则更新。 Kettle简介&#xff1a;Kettle是一款国外开源的ETL工具&#xff0…

spoon mysql教程_kettle 教程(一):简介及入门

介绍 kettle 是纯 java 开发&#xff0c;开源的 ETL工具&#xff0c;用于数据库间的数据迁移 。可以在 Linux、windows、unix 中运行。有图形界面&#xff0c;也有命令脚本还可以二次开发。 安装 这边以 windows 下的配置为例&#xff0c;linux 下配置类似。 jdk 安装及配置环境…

kettle基础使用教程

文章目录 前言一、下载、安装二、启动软件三、转换的使用教程四、作业的使用教程总结 前言 Kettle简介&#xff1a;Kettle是一款国外开源的ETL工具&#xff0c;纯java编写&#xff0c;可以在Window、Linux、Unix上运行&#xff0c;数据抽取高效稳定。Kettle 中文名称叫水壶&…

ETL工具-Kettle Spoon教程

转自&#xff1a;https://blog.csdn.net/liaomin416100569/article/details/82798879 一 。Kettle Spoon简介 ETL&#xff08;Extract-Transform-Load的缩写&#xff0c;即数据抽取、转换、装载的过程&#xff09;&#xff0c;对于企业或行业应用来说&#xff0c;我们经常会遇…

KETTLE 使用教程

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Kettle的建立数据库连接、使用kettle进行简单的全量对比插入更新&#xff1a;kettle会自动对比用户设置的对比字段&#xff0c;若目标表…

spoon mysql教程_Kettle-Spoon入门示例

Spoon 是Kettle的设计调试工具 1.驱动: a) 驱动错误 b) 驱动添加 2.端口错误&#xff1a;连接数据库端口不对 3.正常连接 4.表输入 a) 新建一个表输入&#xff0c;获取数据库表的数据 b) 预览数据 c) 当前表数据输出到另外一个同样的表 d) 当前表数据输出到另外一个同样的表 e)…

数据库转换工具 spoon使用

由于项目需求 需要把oracle数据库转换为mysql数据库&#xff0c;所以使用spoon转换&#xff0c;简单快捷 ETL Kettle Spoon简介 ETL&#xff08;Extract-Transform-Load的缩写&#xff0c;即数据抽取、转换、装载的过程&#xff09;&#xff0c;对于企业或行业应用来说&#…

spoon mysql教程_spoon新手入门教程

Kettle是一款国外开源的ETL工具&#xff0c;纯java编写&#xff0c;可以在Window、Linux、Unix上运行&#xff0c;数据抽取高效稳定。Kettle 中文名称叫水壶&#xff0c;该项目的主程序员MATT 希望把各种数据放到一个壶里&#xff0c;然后以一种指定的格式流出。Kettle这个ETL工…

Kettle工具简单使用(spoon)

1、添加测试数据 在navicat中随便找个表当做被转化的数据进行测试&#xff0c;以下表为例&#xff1a; 在SQL server数据库中创建表 2、下载spoon软件 下载路径&#xff1a;https://download.csdn.net/download/qq_57404736/85013576 打开文件夹&#xff0c;双击spoon.ba…

Spoon工具的使用

Spoon工具的使用 第一步 建立中间表 create table table_name ( code varchar(100), name varchar(100) )第二步 新建转换 在核心对象 输入中找到表输入双击&#xff0c; 输出中找到表输出双击 第三步&#xff0c;双击表输入进入该界面 点新建进入如下界面 填写信息后点T…

spoon入门教程

Kettle是一款国外开源的ETL工具&#xff0c;纯java编写&#xff0c;可以在Window、Linux、Unix上运行&#xff0c;数据抽取高效稳定。Kettle 中文名称叫水壶&#xff0c;该项目的主程序员MATT 希望把各种数据放到一个壶里&#xff0c;然后以一种指定的格式流出。Kettle这个ETL工…

Spoon工具使用(kettle进行实时同步数据)

文章目录 Spoon工具使用&#xff08;kettle进行实时同步数据&#xff09;安装相关概念转换DB连接步骤和节点连接 作业DB连接作业项目 Spoon工具使用&#xff08;kettle进行实时同步数据&#xff09; 安装 解压完Spoon安装包后&#xff0c;双击.bat文件打开 相关概念 转换…

Kettle Spoon入门教程

Kettle是一款国外开源的ETL工具&#xff0c;纯java编写&#xff0c;可以在Window、Linux、Unix上运行&#xff0c;数据抽取高效稳定。其中&#xff0c;Spoon是Kettle中的一个组件&#xff0c;其他组件有PAN&#xff0c;CHEF&#xff0c;Encr和KITCHEN等。 Spoon通过图形化的页…